NuGet cho các giải pháp với nhiều dự án


153

Giả sử tôi có một giải pháp với 3 dự án:

  • Cốt lõi
  • Giao diện người dùng
  • Xét nghiệm

Một số gói NuGet tôi sử dụng sẽ áp dụng cho cả 3 dự án. Một số sẽ chỉ áp dụng cho UI và Tests, và một số sẽ chỉ áp dụng cho Tests (như NUnit).

Là gì đúng cách để thiết lập này bằng cách sử dụng NuGet?

  1. Tôi có nên sử dụng "Thêm tham chiếu gói thư viện" cho cả ba dự án bất cứ khi nào tôi cần tham khảo không?
  2. Tôi có nên sử dụng "Thêm tham chiếu gói thư viện" lần đầu tiên tôi cần một gói và sau đó sử dụng Thêm tham chiếu-> Duyệt cho các lần sử dụng tiếp theo?

Trong cả hai trường hợp, có bao nhiêu packages.config file tôi nên có?

Câu trả lời:


239

Đối với bất kỳ ai vấp phải điều này, bây giờ có tùy chọn sau:

Nhấp chuột phải vào giải pháp của bạn> Quản lý các gói NuGet cho Giải pháp ...

... Hoặc là:

Công cụ> Trình quản lý gói thư viện> Quản lý gói NuGet cho Giải pháp ...

Và nếu bạn đi đến khu vực Gói đã cài đặt, bạn có thể 'Quản lý' một gói duy nhất trên mỗi dự án trong giải pháp.


5
Nếu tôi muốn cài đặt gói cho Solution với phiên bản cụ thể thì sao. Wizard không cho tôi tùy chọn đó. Trong giao diện điều khiển tôi có thể chạy nó như vậy Install-Package RazorEngine -Version 3.3.0nhưng nó sẽ chỉ được áp dụng cho dự án được chọn trong danh sách thả xuống của giao diện điều khiển.
MaciejLisCK

Đây có phải là hỗ trợ trong Visual Studio 2010. Tôi chỉ hỏi một câu hỏi ở đây - stackoverflow.com/questions/33163987/...
user2645830

Nếu bạn có một dự án lớn, bạn có thực sự tin tưởng một người quản lý gói để cập nhật các phụ thuộc không?
Mick

Bạn có biết gì khi không có nút "Quản lý" cho một số gói cụ thể không? Giống như System.ServiceModel, tôi không thể quản lý thư viện này từ chế độ xem giải pháp.
Hoàng Long

@Mick, hãy xem tab Hợp nhất trên hộp thoại được đề cập ... Tôi sẽ!

76

Sử dụng bảng điều khiển để nhắm mục tiêu nhiều dự án

Tools > Library Package Manager > Package Manager Console

sau đó sử dụng lệnh này

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

ví dụ

Get-Project Core,UI | Install-Package FluentDateTime

4
+1: Ít nhất là với phiên bản NuGet hiện tại, tôi vẫn thích phương thức này hơn hộp thoại "Quản lý gói NuGet cho giải pháp", vì giải pháp của chúng tôi rất lớn và tôi không thể dán danh sách tên dự án vào hộp thoại đó.
Yodan Tauber

21

Thỏa thuận ngọt ngào này làm việc cho tôi:

PM> Get-Project -all | where {$_.Name -match "Songhay.Silverlight" -and
    $_.Name -notmatch "ApplicationLoader" -and $_.Name -notmatch ".Xml"}
    | ForEach-Object {Install-Package MvvmLight -project $_.Name}

2
Đây là cách nó được thực hiện! Ví dụ: nếu bạn muốn liệt kê tất cả các phiên bản của json.net cho tất cả các dự án của bạn trong một giải pháp, hãy thử điều này:Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -Filter Newtonsoft.Json}
jonypony3

1
@EdwardMMeshuris lệnh rất tốt nhưng nó sẽ không khớp chính xác với tên gói. Dưới đây là một chút cập nhật cho trận đấu chính xácGet-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' }
Dark_Knight

12

Nếu bạn muốn cài đặt một gói trên nhiều giải pháp, tôi đã viết một tập lệnh Powershell tiện dụng để thực hiện nó, xem tại đây .

Bạn thậm chí có thể lọc Get-Project -Alllệnh và nhắm mục tiêu một tập hợp con của danh sách dự án.


8

Bạn nên sử dụng "Thêm tham chiếu gói thư viện" cho tất cả thư viện bên ngoài của bạn trên mỗi dự án trong giải pháp của bạn. Bạn sẽ kết thúc với một gói.config cho mỗi dự án.

Tuy nhiên, bạn sẽ tải xuống gói chỉ một lần và sử dụng lại chúng cục bộ cho tất cả các dự án khác của bạn.


4
Lưu ý: Nếu bạn không cập nhật tất cả các gói thư viện, bạn sẽ kết thúc với 3 phiên bản khác nhau của cùng một hội đồng. .NET có thể hoạt động với 3 phiên bản khác nhau nếu chúng ở trong GAC hoặc với các tên khác nhau. Nhưng vì họ sẽ có cùng tên. Bạn sẽ kết thúc với các bản dựng không hoạt động vì phiên bản cũ đã được sao chép qua phiên bản mới hơn.
liệu

2

Trong Bảng điều khiển quản lý gói, bạn có thể viết lệnh sau :

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

Bạn cũng có thể sử dụng lệnh đó để cài đặt hoặc cập nhật (Gói cập nhật)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.