NuGet dla rozwiązań z wieloma projektami

153

Załóżmy, że mam rozwiązanie z 3 projektami:

  • Rdzeń
  • UI
  • Testy

Niektóre z pakietów NuGet, których używam, będą miały zastosowanie do wszystkich 3 projektów. Niektóre będą dotyczyły tylko interfejsu użytkownika i testów, a niektóre będą dotyczyły tylko testów (np. NUnit).

Jaki jest właściwy sposób skonfigurowania tego za pomocą NuGet?

  1. Czy powinienem używać opcji „Dodaj odniesienie do pakietu biblioteki” we wszystkich trzech projektach za każdym razem, gdy potrzebuję pliku referencyjnego?
  2. Czy powinienem użyć opcji „Dodaj odniesienie do pakietu biblioteki”, gdy po raz pierwszy potrzebuję pakietu, a następnie użyć opcji Dodaj odniesienie-> Przeglądaj w celu uzyskania kolejnych zastosowań?

W obu przypadkach ile plików packages.config powinienem mieć?

Paul Stovell
źródło

Odpowiedzi:

239

Dla każdego, kto się na to natknie, teraz jest następująca opcja:

Kliknij prawym przyciskiem myszy rozwiązanie> Zarządzaj pakietami NuGet dla rozwiązania ...

... lub:

Narzędzia> Menedżer pakietów biblioteki> Zarządzaj pakietami NuGet dla rozwiązania ...

A jeśli przejdziesz do obszaru Zainstalowane pakiety, możesz „Zarządzać” pojedynczym pakietem w każdym projekcie w rozwiązaniu.

Jason
źródło
5
Co jeśli chcę zainstalować pakiet dla rozwiązania z określoną wersją. Kreator nie daje mi takiej możliwości. W konsoli mogę to tak uruchomić, Install-Package RazorEngine -Version 3.3.0ale będzie to zastosowane tylko do projektu, który jest wybrany w menu rozwijanym konsoli.
MaciejLisCK,
Czy jest to obsługiwane w programie Visual Studio 2010. Właśnie zadałem tutaj pytanie - stackoverflow.com/questions/33163987/ ...
user2645830
Jeśli masz naprawdę duży projekt, czy naprawdę ufasz menedżerowi pakietów w zakresie aktualizowania zależności?
Mick
Czy masz pomysł, kiedy nie ma przycisków „Zarządzaj” dla określonego pakietu? Podobnie jak System.ServiceModel, nie mogę zarządzać tą biblioteką z widoku rozwiązania.
Hoàng Long
@Mick, sprawdź kartę Konsolidacja we wspomnianym oknie dialogowym ... Tak!
76

Użyj konsoli, aby kierować reklamy na wiele projektów

Tools > Library Package Manager > Package Manager Console

następnie użyj tego polecenia

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

na przykład

Get-Project Core,UI | Install-Package FluentDateTime
Szymon
źródło
4
+1: Przynajmniej w bieżącej wersji NuGet nadal wolę tę metodę niż okno dialogowe „Zarządzaj pakietami NuGet w celu rozwiązania”, ponieważ nasze rozwiązanie jest naprawdę duże i nie mogę wkleić listy nazw projektów do tego okna dialogowego.
Yodan Tauber
21

Ta słodka okazja działa dla mnie:

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
źródło
2
Tak to się robi! Na przykład, jeśli chcesz wyświetlić listę wszystkich wersji json.net dla wszystkich swoich projektów w rozwiązaniu, spróbuj tego:Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -Filter Newtonsoft.Json}
jonypony3
1
@EdwardMMeshur to bardzo dobre polecenie, ale nie da dokładnego dopasowania do nazwy pakietu. Tutaj jest nieco zaktualizowany pod kątem dokładnego dopasowaniaGet-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' }
Dark_Knight
12

Jeśli chcesz zainstalować pakiet w wielu rozwiązaniach, napisałem przydatny skrypt Powershell, aby to zrobić, zobacz tutaj .

Możesz nawet filtrować Get-Project -Allpolecenie i kierować reklamy na podzbiór listy projektów.

Aaron Powell
źródło
8

Należy użyć opcji „Dodaj odniesienie do pakietu biblioteki” dla całej biblioteki zewnętrznej w każdym projekcie w rozwiązaniu. Otrzymasz plik packages.config na projekt.

Jednak pobierzesz pakiet tylko raz i użyjesz go ponownie lokalnie we wszystkich innych projektach.

Nekresh
źródło
4
Uwaga: Jeśli nie zaktualizujesz wszystkich pakietów bibliotek, otrzymasz 3 różne wersje tego samego zestawu. .NET może współpracować z 3 różnymi wersjami, jeśli są w GAC lub mają różne nazwy. Ale ponieważ będą miały to samo imię. Skończysz z niedziałającymi kompilacjami, ponieważ stara wersja została skopiowana na nowszą.
graffic
2

W konsoli Menedżera pakietów możesz napisać następujące polecenie :

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

Możesz użyć tego polecenia do instalacji lub aktualizacji (Update-Package)

Mroczny rycerz
źródło