Solusi penargetan ulang dari .Net 4.0 hingga 4.5 - bagaimana cara penargetan ulang paket NuGet?


205

Saya telah memigrasikan solusi yang saat ini menargetkan .NET 4.0 di VS2010 ke VS2012 dan sekarang saya ingin menargetkan kembali ke .Net 4.5

Yang tidak saya yakini adalah paket NuGet. Misalnya EF5, yang saya perbarui dari EF4 di VS2010 ternyata benar-benar EF 4.4 seperti yang Anda lihat di sini:

    <Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll</HintPath>
    </Reference>

Saya juga dapat melihat yang berikut ini di packages.config untuk proyek:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0" targetFramework="net40" />
</packages>

Jadi pertanyaan saya adalah:

Apa praktik terbaik untuk menargetkan kembali semua paket NuGet yang saat ini ditetapkan ke target .NET 4.0 untuk menargetkan .NET 4.5?


Jawaban:


266

NuGet 2.1 menawarkan fitur yang membuat ini lebih sederhana: lakukan saja update-package -reinstall -ignoreDependenciesdari Package Manager Console.

NuGet 2.0 tidak menangani penargetan ulang aplikasi Anda dengan sangat baik. Untuk mengubah kerangka target paket Anda, Anda harus menghapus dan menginstal ulang paket (perhatikan paket yang telah Anda instal sehingga Anda dapat menginstal ulang masing-masing).

Alasan paket harus dihapus dan diinstal ulang adalah:

  • Saat memasang paket, kami menentukan kerangka target proyek Anda
  • Kami kemudian mencocokkannya dengan isi paket, menemukan folder \ lib \ yang sesuai (dan \ content \ folder)
  • Referensi perakitan ditambahkan dengan Petunjuk Petunjuk yang menunjuk ke folder \ lib \ paket, dengan subfolder yang tepat (misalnya \ lib \ net40)
  • File konten disalin dari folder paket \ konten \, dengan subfolder kanan (misalnya \ content \ net40)
  • Kami mencatat targetFramework yang digunakan untuk menginstal paket di dalam file paket.config
  • Setelah Anda mengubah kerangka target proyek Anda, Petunjuk Petunjuk masih menunjuk ke net40
  • Ketika Anda menghapus paket, kami memeriksa targetFramework yang direkam dalam paket.config untuk melihat libs / konten kerangka kerja target apa yang harus dihapus dari proyek Anda
  • Saat Anda menginstal ulang paket, kami mendeteksi kerangka target Anda yang diperbarui dan referensi / salin libs / konten yang tepat

Menggunakan VS 2012 dengan proyek ASP.NET MVC 4 dan setelah menargetkan ulang .NET Framework dari 4.0 hingga 4.5, saya dieksekusi update-package -reinstalldi Package Manager Console. Semua paket mulai dihapus dan diperbarui dan tiba-tiba Windows 8 dimulai kembali dan ketika kembali ia memberi tahu "PC Anda mengalami masalah dan restart. Apakah Anda ingin mengirim informasi ke Microsoft?" :( Takut ... Ngomong-ngomong, ini adalah versi NuGet yang saya instal sekarang: 2.2.40116.9051Membuka masalah di sini: nuget.codeplex.com/workitem/3049
Leniel Maccaferri

12
opsi-instal tidak pernah berfungsi untuk saya. Entah menghapus dalam urutan yang salah dan kesalahan pada "tidak dapat menghapus X karena Y tergantung padanya" atau kadang-kadang hanya paket readd tidak. Terakhir kali saya mencobanya, itu menghapus EntityFramework dan kemudian tidak pernah menambahkannya kembali.
CodingWithSpike

4
update-package -reinstall bukan solusi bagi saya. Itu juga memperbarui banyak paket, daripada membiarkannya pada versi yang kami gunakan dan telah diuji terhadapnya. Misalnya, Ninject dipindahkan ke v3, dan itu adalah perubahan versi yang melanggar.
Steve Owen

13
Jangan coba-coba pembaruan-halaman-instal. Hal ini sangat berantakan ketika dijalankan pada mesin lokal saya sehingga saya harus menghentikan manajer Paket NuGet dari melangkah lebih jauh. Itu menghapus versi jQuery 1.10 saya dan menggantinya dengan 1.4.4 untuk beberapa alasan. Lakukan saja secara manual dan selamatkan diri dari kerepotan.
JustinMichaels

2
Setuju dengan kekacauan itu, dan itu bahkan dua tahun setelah posting ini. Itu menemukan versi yang lebih rendah dari nuget tertentu, dan mengacaukan banyak referensi. Dan itu setelah hampir dua jam memperbarui (pada workstation high-end dari awal 2014). 20 proyek dalam solusinya.
Arve Systad

42

Bagi mereka yang memiliki masalah dengan update-package -reinstall <packagename>perintah, pertimbangkan untuk menjalankannya dengan -ignoreDependenciesflag, seperti ini:

update-package -reinstall <packagename> -ignoreDependencies

Bendera ini akan membiarkan dependensi paket Anda sendiri, jika tidak mereka mungkin akan diperbarui bahkan jika paket yang Anda ingin instal ulang tetap mempertahankan versinya.

Info lebih lanjut di sini .


Terima kasih, itu benar-benar menghemat banyak masalah. Menyaksikan Nuget mencoba menginstal ulang 10 atau lebih dependensi yang cenderung dibuat oleh EnterpriseLibrary, pada 30+ proyek, sedang menuju pekerjaan sehari penuh. Ini membawanya ke menit.
David Keaveny

Seperti yang disebutkan orang lain, sangat mungkin untuk menghancurkan segalanya.
Gleno

9
Anda dapat mengotomatisasi ini untuk seluruh solusi dengan mengubahnya hanya sedikit ketika berjalan di bawah Package Manager Console:get-package | % { update-package $_.Id -reinstall -ProjectName $_.ProjectName -ignoreDependencies }
Kaleb Pederson

2
@ KalebPederson Dalam pengalaman saya, perintah ini berfungsi luas?

1
@ BjörnAliGöransson - Maaf jika saya tidak cukup jelas. Jawabannya menyediakan cara untuk memperbarui satu paket di seluruh solusi. Skrip saya akan memeriksa setiap paket NuGet dalam solusi dan menargetkan ulang seluruh solusi. Jawabannya sangat cocok untuk satu proyek tetapi naskah yang saya berikan mungkin lebih baik jika Anda memiliki banyak paket yang perlu ditargetkan ulang.
Kaleb Pederson

22

Setelah mencoba jawaban yang diterima tidak berhasil saya ingin menyarankan perintah yang kurang berisiko:

Update-Package <PackageName> -ProjectName <ProjectName> -Reinstall -IgnoreDependencies

Untuk info lebih lanjut: http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html


1
Menurut dokumentasi yang ditautkan -reinstallhanya akan menginstal versi yang sama, jadi tidak melihat manfaat apa pun untuk digunakan -safe. Apakah saya melewatkan sesuatu?
Kaleb Pederson

4

Sementara mencoba untuk menginstal ulang solusi paket lebar, saya mengalami kesalahan ketergantungan (meskipun menggunakan -ignoreDependenciesbendera), dan semua packages.config file untuk setiap proyek telah dihapus. Dalam VS2013, tampaknya packages.config tidak mendapatkan memerah kembali ke disk dan re-ditambahkan sampai semua dependensi upgrade / referensi yang re-melekat pada proyek tersebut.

Dalam kasus saya apa yang bekerja adalah untuk meng-upgrade setiap proyek satu-di-a-waktu dengan menambahkan -ProjectName projectname ke update-packageperintah. Dalam hal ini paket.config diperbarui karena setiap proyek ditingkatkan.

Mungkin tidak praktis untuk solusi yang sangat besar tetapi tampaknya kompromi yang masuk akal untuk tetap mengambil keuntungan dari peningkatan otomatis untuk sebanyak mungkin proyek dan mengisolasi yang bermasalah tanpa setiap paket. Konfigurasikan dalam solusi Anda dihapus pada kegagalan.


3
Saya mengalami masalah yang sama. UpdatePackage -Reinstallmenghapus package.config dan referensi proyek untuk beberapa proyek (khususnya yang memiliki kumpulan palsu yang dihasilkan di dalamnya). Kami mengatasi ini dengan membatalkan semua perubahan pada proyek yang kacau dan menjalankan:Update-Package -reinstall -ProjectName "PROJECTNAME" -IgnoreDependencies
MSC

1

Dengan Visual Studio untuk Mac 2019, mengklik kanan folder Paket menunjukkan opsi 'Retarget' di menu. Ini menyelesaikan masalah penargetan ulang untuk semua paket dalam proyek yang membutuhkan penargetan ulang. Sepertinya tidak ada Package Manager NuGet di bawah menu Tools di Visual Studio for Mac (minimal milik saya), jadi saya tidak bisa meluncurkan Package Manager Console.

Opsi menu penargetan ulang di bawah Paket menu klik kanan

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.