NuGet untuk solusi dengan beberapa proyek

153

Misalkan saya punya solusi dengan 3 proyek:

  • Inti
  • UI
  • Tes

Beberapa paket NuGet yang saya gunakan akan berlaku untuk semua 3 proyek. Beberapa hanya akan berlaku untuk UI dan Tes, dan beberapa hanya akan berlaku untuk Tes (seperti NUnit).

Apa cara yang tepat untuk mengatur ini menggunakan NuGet?

  1. Haruskah saya menggunakan "Tambahkan Referensi Paket Perpustakaan" pada ketiga proyek kapan saja saya membutuhkan referensi?
  2. Haruskah saya menggunakan "Tambahkan Referensi Paket Perpustakaan" pertama kali saya membutuhkan paket, dan kemudian gunakan Tambahkan Referensi-> Jelajahi untuk penggunaan selanjutnya?

Dalam kedua kasus, berapa banyak packages.config file yang harus saya miliki?

Paul Stovell
sumber

Jawaban:

239

Bagi siapa saja yang menemukan ini, sekarang ada pilihan berikut:

Klik kanan solusi Anda> Kelola Paket NuGet untuk Solusi ...

... Atau:

Alat> Manajer Paket Perpustakaan> Kelola Paket NuGet untuk Solusi ...

Dan jika Anda pergi ke area Paket terinstal, Anda dapat 'Mengelola' satu paket di setiap proyek dalam solusi.

Jason
sumber
5
Bagaimana jika saya ingin menginstal paket untuk Solusi dengan versi spesifik. Wizard tidak memberi saya opsi itu. Di konsol saya dapat menjalankannya seperti itu Install-Package RazorEngine -Version 3.3.0tetapi itu akan diterapkan hanya untuk proyek yang dipilih di dropdown konsol.
MaciejLisCK
Apakah ini didukung di Visual Studio 2010. Saya hanya mengajukan pertanyaan di sini - stackoverflow.com/questions/33163987/…
user2645830
Jika Anda memiliki proyek yang sangat besar, apakah Anda benar-benar mempercayai seorang manajer paket untuk memperbarui dependensi?
Mick
Apakah Anda tahu ketika tidak ada tombol "Kelola" untuk beberapa paket tertentu? Seperti System.ServiceModel, saya tidak bisa mengelola perpustakaan ini dari tampilan solusi.
Hoàng Long
@Mick, lihat tab Konsolidasi pada dialog yang disebutkan ... Saya akan!
76

Gunakan konsol untuk menargetkan beberapa proyek

Tools > Library Package Manager > Package Manager Console

kemudian gunakan perintah ini

Get-Project PROJECT-NAMES-WITH-COMMAS | Install-Package PACKAGENAME

sebagai contoh

Get-Project Core,UI | Install-Package FluentDateTime
Simon
sumber
4
+1: Setidaknya dengan versi NuGet saat ini, saya masih lebih suka metode ini daripada dialog "Kelola Paket NuGet untuk Solusi", karena solusi kami sangat besar, dan saya tidak bisa menempelkan daftar nama proyek ke dalam dialog itu.
Yodan Tauber
21

Kesepakatan manis ini bekerja untuk saya:

PM> Get-Project -all | where {$_.Name -match "Songhay.Silverlight" -and
    $_.Name -notmatch "ApplicationLoader" -and $_.Name -notmatch ".Xml"}
    | ForEach-Object {Install-Package MvvmLight -project $_.Name}
rasx
sumber
2
Beginilah caranya! Sebagai contoh jika Anda ingin membuat daftar semua versi json.net untuk semua proyek Anda dalam solusi coba ini:Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -Filter Newtonsoft.Json}
jonypony3
1
@EdwardMMeshuris perintah yang sangat bagus tetapi tidak akan sama persis dengan nama paket. Berikut ini sedikit diperbarui untuk pencocokan tepatGet-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' }
Dark_Knight
12

Jika Anda ingin menginstal paket di beberapa solusi, saya menulis skrip Powershell yang berguna untuk melakukannya, lihat di sini .

Anda bahkan dapat memfilter Get-Project -Allperintah dan menargetkan sub-set daftar proyek.

Aaron Powell
sumber
8

Anda harus menggunakan "Tambahkan Referensi Paket Perpustakaan" untuk semua perpustakaan eksternal Anda pada setiap proyek dalam solusi Anda. Anda akan berakhir dengan paket.config per proyek.

Namun, Anda hanya akan mengunduh paket satu kali dan menggunakannya kembali secara lokal untuk semua proyek Anda yang lain.

Nekresh
sumber
4
Catatan: Jika Anda tidak memperbarui semua paket perpustakaan, Anda akan berakhir dengan 3 versi berbeda dari rakitan yang sama. .NET dapat bekerja dengan 3 versi berbeda jika mereka berada di GAC atau dengan nama yang berbeda. Tetapi karena mereka akan memiliki nama yang sama. Anda akan berakhir dengan build yang tidak bekerja karena versi yang lama disalin dari versi yang lebih baru.
graffic
2

Di Package Manager Console Anda dapat menulis perintah berikut :

Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter 
PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' } | Install-Package 
PACKAGE_NAME -Version VERSION

Anda dapat menggunakan perintah itu untuk menginstal atau memperbarui juga (Paket-Pembaruan)

Kesatria Kegelapan
sumber