Bagaimana cara mendapatkan NuGet untuk menginstal / memperbarui semua paket di paket.config?

674

Saya punya solusi dengan beberapa proyek di dalamnya. Sebagian besar referensi pihak ketiga tidak ada, namun ada packages.configfile untuk setiap proyek. Bagaimana saya membuat NuGet menginstal / memperbarui semua paket yang dibutuhkan? Apakah ini perlu dilakukan melalui baris perintah untuk setiap proyek?

Samuel G
sumber
10
Silakan pertimbangkan untuk mengubah jawaban yang diterima, karena NuGet sekarang jauh lebih terintegrasi ke dalam Visual Studio dan ada cara yang lebih mudah untuk menyelesaikan masalah ini.
skolima
2
Dengan rilis NuGet 2.5 terbaru sekarang ada tombol "Perbarui Semua" di manajer paket: docs.nuget.org/docs/release-notes/…
Erik Schierboom
@ErikSchierboom Terima kasih! Utas ini harus diperbarui karena sekarang tersedia
Karl Cassar
Proyek terkait: chocolatey.org
Jayan
1
Untuk kepentingan pencari, di VS2013, Anda dapat mengklik kanan solusinya dan memilih 'Aktifkan Pemulihan Paket NuGet'. Kemudian bangun.
HockeyJ

Jawaban:

870

Anda dapat menggunakan nuget.exe untuk memulihkan paket Anda atau dengan NuGet 2.7, atau diinstal, Anda dapat dengan mudah mengkompilasi solusi Anda di Visual Studio, yang juga akan mengembalikan paket yang hilang.

Untuk NuGet.exe Anda dapat menjalankan perintah berikut untuk setiap proyek.

nuget install packages.config

Atau dengan NuGet 2.7 Anda dapat mengembalikan semua paket dalam solusi menggunakan baris perintah.

nuget restore YourSolution.sln

Kedua hal ini akan menurunkan paket. Namun file proyek Anda tidak akan diubah ketika menjalankan perintah ini sehingga proyek seharusnya sudah memiliki referensi ke paket NuGet. Jika ini tidak terjadi maka Anda dapat menggunakan Visual Studio untuk menginstal paket.

Dengan NuGet 2.7, dan di atas, Visual Studio akan secara otomatis mengembalikan paket NuGet yang hilang ketika Anda membangun solusi Anda sehingga tidak perlu menggunakan NuGet.exe.

Untuk memperbarui semua paket dalam solusi Anda, pertama kembalikan, dan kemudian Anda dapat menggunakan NuGet.exe untuk memperbarui paket atau dari dalam Visual Studio Anda dapat memperbarui paket dari jendela Package Manager Console, atau akhirnya Anda dapat menggunakan Kelola Dialog paket.

Dari baris perintah, Anda dapat memperbarui paket dalam solusi ke versi terbaru yang tersedia dari nuget.org.

nuget update YourSolution.sln

Perhatikan bahwa ini tidak akan menjalankan skrip PowerShell dalam paket NuGet.

Dari dalam Visual Studio Anda dapat menggunakan Konsol Manajer Paket untuk juga memperbarui paket. Ini memiliki manfaat bahwa setiap skrip PowerShell akan dijalankan sebagai bagian dari pembaruan di mana menggunakan NuGet.exe tidak akan menjalankannya. Perintah berikut akan memperbarui semua paket di setiap proyek ke versi terbaru yang tersedia dari nuget.org.

Update-Package

Anda juga dapat membatasi ini pada satu proyek.

Update-Package -Project YourProjectName

Jika Anda ingin menginstal ulang paket ke versi yang sama seperti yang sebelumnya diinstal maka Anda dapat menggunakan -reinstallargumen dengan Update-Packageperintah.

Update-Package -reinstall

Anda juga dapat membatasi ini pada satu proyek.

Update-Package -reinstall -Project YourProjectName

The -reinstallpilihan pertama akan uninstall dan kemudian menginstal paket tersebut kembali lagi ke proyek.

Atau, Anda dapat memperbarui paket menggunakan Manage Packagesdialog.

Pembaruan:

  • 2013/07/10 - Diperbarui dengan informasi tentang nuget restore di NuGet 2.7
  • 2014/07/06 - Diperbarui dengan informasi tentang pemulihan paket otomatis di Visual Studio dan membawa jawabannya dengan perubahan lain ke NuGet.
  • 2014/11/21 - Diperbarui dengan informasi tentang-reinstall
Matt Ward
sumber
15
Apakah ada perintah sederhana dalam Visual Studio untuk melakukan ini? Saya telah mengaktifkan kembali secara otomatis untuk solusi tetapi "Build" masih memberi saya banyak kesalahan karena referensi yang hilang (paket belum dipulihkan dari paket.config).
Borek Bernard
1
Saya rasa tidak perlu menginstal sesuatu seperti NuGet Power Tools - github.com/davidfowl/NuGetPowerTools . Namun itu pada dasarnya akan melakukan hal yang sama dengan pengembalian otomatis yang sudah Anda miliki.
Matt Ward
2
Ini juga berfungsi untuk menginstal paket secara umum, tidak hanya untuk "mengembalikan" mereka (tidak ada perbedaan teknis yang besar, seperti memulihkan menginstal IS; tetapi itu tidak terbatas pada orang yang ingin menggunakan fitur paket solusi pemulihan). Namun, Anda perlu mengatur variabel lingkungan EnableNuGetPackageRestore untuk tujuan ini. Saya mengaturnya dalam skrip psake saya sebelum memanggil "nuget install packages.config" seperti: $ env: EnableNuGetPackageRestore = "true". Ini menetapkan var untuk proses PS dan proses yang ditimbulkannya, tanpa memengaruhi variabel-variabel seluruh mesin (dan mungkin build lain).
galaktor
Memulihkan tidak sama dengan menginstal. Menginstal paket dari baris perintah tidak akan mengubah proyek Anda sehingga hal-hal seperti referensi perakitan tidak akan ditambahkan.
Matt Ward
3
Saya harus menghabiskan setidaknya satu jam mencari solusi dan akhirnya memangUpdate-Package -reinstall -Project ProjectName
Wiz
529

Instal ulang semua paket dalam SEMUA PROYEK dari solusi saat ini:

Update-Package -Reinstall

Instal ulang semua paket dalam PROYEK SPESIFIK dari solusi saat ini ( Terima kasih atas ketidaksetaraan dan abu999 ):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Rodolpho Brock
sumber
60
saya pikir ini benar-benar yang diinginkan OP, dan jauh lebih mudah daripada semua solusi lain ...
jaminto
4
Ini adalah opsi nuklir jika Anda hanya perlu bekerja SEKARANG JUGA.
Chris
11
Ini juga merupakan opsi yang sempurna untuk jika Anda baru saja mengubah kerangka target Anda atau yang serupa. Saya menghadapi prospek harus memperbarui 25 proyek aneh dengan banyak paket nuget yang tersebar di sekitar mereka dan perintah pertama sempurna untuk apa yang saya inginkan. Dan bahkan nuke dalam arti terlalu banyak.
Chris
7
Ini harus menjadi jawaban untuk pertanyaan ini, jawaban yang diterima bekerja tetapi ini secara khusus menjawab pertanyaan. +1 karena tepat seperti yang dibutuhkan.
krystan honor
10
Anda bahkan mungkin ingin menambahkan saklar -IgnoreDependencies. Saya mengalami kegagalan Pemutakhiran-Paket karena ketergantungan pada salah satu paket yang saya gunakan ada di versi yang lebih baru daripada yang ditentukan dalam paket
saya.config
167

Ada cara lain, yang lebih baru dan lebih cepat untuk melakukan ini dari dalam Visual Studio. Periksa pos ini oleh David Ebbo, dan rujuk bagian komentar jika Anda mengalami masalah. Pada dasarnya, Anda melakukan hal berikut ini di Package Manager prompt:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

Setelah itu, ketika Anda membangun solusi Anda, paket-paket akan diinstal secara otomatis jika hilang.

Memperbarui:

Fungsi ini dibangun ke dalam Nuget 1.6 dengan integrasi studio visual sehingga Anda bahkan tidak perlu menginstal NuGetPowerTools atau mengetik perintah. Yang harus Anda lakukan adalah

Klik kanan pada simpul Solusi di Solution Explorer dan pilih Aktifkan Pemulihan Paket NuGet.

Baca artikel ini untuk lebih jelasnya.

Alex
sumber
6
Jawaban yang diperbarui di sini akan menjadi solusi terbaik bagi kebanyakan orang karena mereka tidak akan memiliki nuget.exe (tetapi nuget akan diinstal ke Visual Studio).
Tod Thomson
1
Tetapi paket restore sebenarnya mengunduh nuget.exe untuk Anda
Konstantin
4
Saya baru saja melakukan ini. dan masih gagal membangun mengatakan referensi tidak ada. Build mengatakan bahwa semua paket sudah diinstal. Saya pergi ke folder solusi / paket menghapus paket yang dimaksud dan mengunduhnya dan mulai bekerja.
Maslow
3
@Shy cara ini sekarang sudah ditinggalkan demi solusi yang tidak mengubah semua file proyek Anda.
The Muffin Man
20

Berikut solusi lain jika Anda menggunakan proyek situs web, atau tidak ingin mengaktifkan Pemulihan Paket NuGet.

Anda dapat menggunakan konsol manajer paket untuk menghitung semua paket dalam file package.config dan menginstalnya kembali.

# read the packages.config file into an XML object
[xml]$packages = gc packages.config

# install each package 
$packages.packages.package | % { Install-Package -id $($_.id) -Version $($_.version) }
David Martin
sumber
4
Saya mencoba masing-masing jawaban di atas dan tidak dapat membuatnya mengerjakan salah satu solusi saya. Tetapi variasi yang satu ini terjadi. $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
PerryJ
1
pemulihan paket nuget adalah mimpi buruk jika Anda menggunakan beberapa solusi pada csproj yang sama ... saya salut jawaban ini!
felickz
1
Ini tidak memperbaiki masalah saya tapi itu jelas membuat saya merasa lebih baik!
Pengacara Setan
Ini luar biasa, dan menyediakan cara untuk memigrasikan paket ke proyek baru: [xml] $ package = gc c: \ PathToExisting \ Packages.config #followed oleh # install setiap paket $ package.packages.package | % {Instal-Paket -id $ ($ _. Id) -Versi $ (versi $ _.)}
reckface
1
@ Jerry Anda bisa saja mengetik Update-Package -Reinstall.
BrainSlugs83
16
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

Ini adalah contoh terbaik dan termudah yang saya temukan. Ini akan menginstal ulang semua nuget yang terdaftar dalam paket.config dan itu akan mempertahankan versi saat ini. Ganti YourProjectNameGoesHeredengan nama proyek.

ketidaksamaan
sumber
Saya punya beberapa masalah dengan ini karena paket saya.config berisi referensi ke dua paket dengan versi spesifik, tetapi satu paket tergantung pada yang lain tanpa versi spesifik. Ketika saya menjalankan pembaruan, itu pertama dihapus instal semua paket dan kemudian gagal menginstal ulang karena versi yang lebih baru dari dependensi 'sudah direferensikan'. Penghapusan telah bekerja dengan baik, jadi sekarang paket saya.config kosong. Saya harus mengembalikan paket.config dari kontrol sumber dan memperbarui paket yang bertentangan sebelum mencoba pembaruan lengkap ...
Mathias Falkenberg
7

Saya menggunakan visual studio 2015 dan solusi yang diberikan di atas tidak bekerja untuk saya, jadi saya melakukan yang berikut:

Hapus folder paket dari solusi saya dan juga folder bin dan obj dari setiap proyek dalam solusi dan berikan kembali.

Mungkin Anda akan memiliki kesalahan berikutnya:

tidak dapat menemukan nuget.exe

Untuk mengatasinya: Ubah baris ini di file NuGet.targets Anda dan atur menjadi true:

<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>

Referensi: https://stackoverflow.com/a/30918648 dan https://stackoverflow.com/a/20502049

mejiamanuel57
sumber
4

Jika Anda menginstal Nuget 2.8, centang kotak centang

Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build

dalam Visual Studio. Jika dicentang, maka cukup membangun kembali proyek akan mengembalikan semua perpustakaan referensi Anda.

Yevgraf Andreyevich Zhivago
sumber
Pilihan paling nyaman dari UI Visual Studio. Anda juga perlu mencentang Allow NuGet to download missing packageskotak centang juga.
RBT
4

Setelah 3 jam pencarian dan penyelidikan.

Saya punya masalah dengan itu karena kami memiliki dua anggota dalam tim (menggunakan kontrol sumber GitHub), karena kami tidak membatasi file untuk paket untuk dikirim ke repositori jarak jauh, salah satu anggota tim mengirim paket ke server dan saya telah menarik perubahan itu ke lokal saya.

Setelah itu saya memiliki masalah yang sama dengan PO, juga saya tidak dapat mempublikasikan proyek API saya ke server.

Di dan saya baru saja digunakan

Update-Package -Reinstall - jalankan perintah ini di Package Manager Console

Perintah ini akan menginstal ulang semua paket Anda yang telah Anda gunakan dalam solusi Anda. (Untuk setiap proyek)

Instal ulang semua paket dalam SEMUA PROYEK dari solusi saat ini:

Update-Package -ProjectName 'NameOfProject' -Reinstall - jalankan perintah ini di Package Manager Console

Perintah ini akan menginstal ulang semua paket Anda yang terkait dengan proyek yang Anda tentukan setelah "-ProjectName". Dan saya pikir ini lebih baik karena saya harus menunggu setengah jam untuk menginstal ulang semua paket dalam solusi.

Terima kasih banyak untuk Rodolpho Brock .

Juga, saya akan merekomendasikan Anda bahwa ketika Anda menarik perubahan dari server jauh, untuk menekan tombol "Kembalikan paket" yang akan ditampilkan oleh Visual studio.

Nihad Delic
sumber
3

Saya percaya hal pertama yang perlu Anda lakukan adalah mengaktifkan fitur restore paket . Lihat juga di sini . Ini dilakukan pada tingkat solusi (bukan proyek).

Tapi itu tidak akan membantu Anda - saya mengalami masalah serupa setelah mengaktifkan fitur restore. (VS2013, NuGet 2.8.)

Ternyata saya (tanpa sengaja) melakukan paket-paket ke kontrol sumber ketika saya melakukan proyek - tetapi Visual Studio (dan plugin kontrol sumber) telah membantu mengabaikan binari ketika melakukan check-in.

Masalah muncul ketika saya membuat cabang rilis. Salinan lokal saya dari cabang dev / main / trunk memiliki binari, karena di situlah saya awalnya menginstal / mengunduh paket.
Namun, di cabang rilis baru,

  • folder paket dan .nupkgfile ada di sana - jadi NuGet tidak berpikir ada sesuatu untuk dipulihkan;
  • tetapi pada saat yang sama, tidak ada DLL yang hadir - yaitu referensi pihak ketiga hilang - jadi saya tidak bisa membangun.

Saya menghapus semua folder paket di $(SolutionDir)/packages( di bawah cabang rilis) dan kemudian menjalankan pembangunan kembali penuh, dan kali ini build berhasil.
... dan tentu saja saya kembali dan menghapus folder paket dari kontrol sumber (di cabang trunk dan rilis). Saya belum jelas (belum) tentang apakah repositories.configfile tersebut harus dihapus juga.

Banyak komponen yang diinstal untuk Anda oleh templat proyek - setidaknya untuk proyek web - adalah paket NuGet. Artinya, masalah ini tidak terbatas pada paket yang Anda tambahkan.
Jadi aktifkan pengembalian paket segera setelah membuat proyek / solusi, dan sebelum Anda melakukan check-in awal, kosongkan packagesfolder (dan pastikan Anda mengkomit .nugetfolder tersebut ke kontrol sumber).

Penafian: Saya melihat jawaban lain di sini pada SO yang menunjukkan bahwa membersihkan packagesfolder adalah bagian dari resolusi. Itu menempatkan saya di jalur yang benar, jadi saya ingin memberikan penghargaan kepada penulis, tetapi saya tidak dapat lagi menemukan pertanyaan / jawaban itu. Saya akan memposting hasil edit jika saya tersandung.

Saya juga mencatat bahwa Update-Package -reinstallakan memodifikasi .slndan .csproj/ .vbprojfile. Setidaknya itulah yang dilakukannya dalam kasus saya. IMHO mana yang membuat opsi ini jauh lebih menarik.

David
sumber
Saya memiliki masalah yang sama persis ini dan menghabiskan waktu yang lama untuk memutakhirkan dan menginstal ulang paket ketika ketika Anda mengatakan semua yang perlu dilakukan adalah menghapus paket lokal.
Thomas Boby
3

Saya mencoba Update-Package -reinstalltetapi gagal pada satu paket dan berhenti memproses semua paket proyek yang tersisa dalam solusi saya.

Saya berakhir dengan skrip saya yang menyebutkan semua file package.config dan berjalan Update-Package -Reinstall -ProjectName prj -Id pkguntuk setiap proyek / paket.

Semoga bermanfaat bagi seseorang:

$files = Get-ChildItem -Recurse -Include packages.config;

[array]$projectPackages = @();
$files | foreach { [xml]$packageFile = gc $_; $projectName = $_.Directory.Name; $packageFile.packages.package.id | foreach { $projectPackages += @( ,@( $projectName, $_ ) ) } }

$projectPackages | foreach { Update-Package -Reinstall -ProjectName $_[0] -Id $_[1] }

Sunting: Ini adalah kesalahan yang saya miliki: Pembaruan-Paket: Tidak dapat menemukan paket 'EntityFramework.BulkInsert-ef6'. Paket yang ada harus dipulihkan sebelum melakukan instalasi atau pembaruan. Jalankan manual Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 bekerja dengan sangat baik.

Sergei Zinovyev
sumber
2
Terima kasih. Saya menangis dengan gembira
cleftheris
Saya menangis dengan gembira juga! Iya!! apa penghemat waktu. Sama seperti FYI jika Anda menggunakan baris ini alih-alih baris terakhir dalam skrip Sergei, itu tidak akan menginstal dependensi. Hanya instal ulang langsung: $ projectPackages | foreach {Update-Package -IgnoreDependencies -Instal Ulang -ProjectName $ _ [0] -Id $ _ [1]}
ElMatador
2

Bagi mereka yang tiba di sini karena build server melakukan pelanggaran ini, Anda dapat membuat target MSBuild menjalankan perintah exec untuk menjalankan perintah nuget restore , seperti di bawah ini (dalam hal ini nuget.exe ada di folder .nuget, daripada di jalan), yang kemudian dapat dijalankan dalam langkah membangun TeamCity segera sebelum membangun solusi

<Target Name="BeforeBuild">
  <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>
Fetchez la vache
sumber
1

sekarang Nuget Package Manager Console di Visual Studio 2012 memberi Anda tombol "Kembalikan" secara otomatis segera menemukan paket apa pun tidak diinstal tetapi di sana di package.config. Fitur Luar Biasa!

Sunny Sharma
sumber
2
Ini berlaku untuk Visual Studio 2010 juga
paulroho
1

Di VS2012 V11, jika saya menggunakan "-Reload" pada akhir baris tidak berfungsi.

Jadi saya hanya menggunakan:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
pengguna3516584
sumber
1

Saya tahu ini adalah posting lama, tetapi saya pikir ini bisa berguna. Jika Anda perlu mengabaikan paket tertentu selama proses pembaruan (seperti paket apa pun yang memperbarui referensi JavaScript), gunakan skrip PowerShell berikut (pastikan sumber paket Anda disetel ke "Semua" di Package Manager Console):

EDIT 2014-09-25 10:55 EST - Memperbaiki bug dalam skrip

$packagePath = "packages.config"
$projectName = "MyProjectName"

$packagesToIgnore = @(
    "bootstrap",
    "jQuery",
    "jquery-globalize",
    "jquery.mobile",
    "jQuery.jqGrid",
    "jQuery.UI.Combined",
    "jQuery.Validation",
    "Microsoft.jQuery.Unobtrusive.Validation",
    "Modernizr",
    "Moment.js"
)

[xml]$packageFile = gc $packagePath
$packagesToProcess = $packageFile.packages.package | Where-Object {$packagesToIgnore -notcontains $_.id}

$packagesToProcess | % { Update-Package -reinstall -projectname $projectName -id $($_.id) }
Joe the Coder
sumber
1

Tidak tahu sejak kapan, tetapi dalam VS2019 Anda dapat melakukannya dengan cara yang lebih mudah:

  1. solusi klik kanan di Solution Explorer
  2. pilih Kelola Paket Nuget untuk Solusi
  3. ada 4 tab, Browse, Installed, Updates, Consolidate
  4. Konsolidasi menunjukkan jika ada proyek yang menggunakan versi paket yang berbeda (dan dalam kebanyakan kasus, itu sebabnya kami ingin memperbarui semua paket)
  5. Pembaruan menunjukkan jika ada pembaruan yang tersedia di proyek APAPUN. Pilih semua dan klik perbarui, pekerjaan akan selesai.
cheny
sumber
0

Dalam Visual Studio 2017 - Ketika Anda mengkompilasi menggunakan IDE - Ini akan mengunduh semua paket nuget yang hilang dan menyimpannya di folder "paket".

Tetapi pada kompilasi mesin build dilakukan dengan menggunakan msbuild.exe. Dalam hal ini, saya mengunduh nuget.exe.

Selama setiap proses pembuatan sebelum menjalankan msbuild.exe. Ini akan mengeksekusi -> mengembalikan nuget.exe NAME_OF_SLN_File (jika hanya ada satu file .SLN maka Anda dapat mengabaikan parameter itu).

David
sumber
Saya menemukan bahwa Anda dapat menggunakan MSBuild -t: restore pada SLN di baris perintah untuk melakukan ini. MSbuild -t:restore Xxxx.sln
Mike Kelly