NuGet für Lösungen mit mehreren Projekten

153

Angenommen, ich habe eine Lösung mit 3 Projekten:

  • Ader
  • Benutzeroberfläche
  • Tests

Einige der von mir verwendeten NuGet-Pakete gelten für alle drei Projekte. Einige gelten nur für die Benutzeroberfläche und Tests, andere nur für Tests (wie NUnit).

Was ist der richtige Weg, um dies mit NuGet einzurichten?

  1. Sollte ich "Bibliothekspaketreferenz hinzufügen" für alle drei Projekte verwenden, wenn ich eine Referenz benötige?
  2. Sollte ich "Bibliothekspaketreferenz hinzufügen" verwenden, wenn ich zum ersten Mal ein Paket benötige, und dann Referenz hinzufügen-> Für nachfolgende Verwendungen suchen verwenden?

Wie viele packages.config- Dateien sollte ich in jedem Fall haben?

Paul Stovell
quelle

Antworten:

239

Für alle, die darüber stolpern, gibt es jetzt die folgende Option:

Klicken Sie mit der rechten Maustaste auf Ihre Lösung> NuGet-Pakete für Lösung verwalten ...

... Oder:

Extras> Bibliothekspaket-Manager> NuGet-Pakete für Lösung verwalten ...

Wenn Sie zum Bereich Installierte Pakete gehen, können Sie ein einzelnes Paket für jedes Projekt in der Lösung verwalten.

Jason
quelle
5
Was ist, wenn ich ein Paket für Solution mit einer bestimmten Version installieren möchte? Der Assistent gibt mir diese Option nicht. In der Konsole kann ich es so ausführen, Install-Package RazorEngine -Version 3.3.0aber es wird nur für Projekte angewendet, die in der Konsolen-Dropdown-Liste ausgewählt sind.
MaciejLisCK
Wird dies in Visual Studio 2010 unterstützt ?
user2645830
Wenn Sie ein ernsthaft großes Projekt haben, würden Sie einem Paketmanager wirklich vertrauen, um Abhängigkeiten zu aktualisieren?
Mick
Haben Sie eine Idee, wenn es für ein bestimmtes Paket keine "Verwalten" -Schaltflächen gibt? Wie bei System.ServiceModel kann ich diese Bibliothek nicht in der Lösungsansicht verwalten.
Hoàng Long
@ Mick, sehen Sie sich die Registerkarte Konsolidieren im genannten Dialogfeld an ... Ich würde!
76

Verwenden Sie die Konsole, um auf mehrere Projekte abzuzielen

Tools > Library Package Manager > Package Manager Console

Verwenden Sie dann diesen Befehl

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

beispielsweise

Get-Project Core,UI | Install-Package FluentDateTime
Simon
quelle
4
+1: Zumindest mit der aktuellen NuGet-Version bevorzuge ich diese Methode immer noch gegenüber dem Dialogfeld "NuGet-Pakete für Lösung verwalten", da unsere Lösung sehr umfangreich ist und ich keine Liste von Projektnamen in dieses Dialogfeld einfügen kann.
Yodan Tauber
21

Dieser süße Deal funktioniert für mich:

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
quelle
2
So wird es gemacht! Wenn Sie beispielsweise alle Versionen von json.net für alle Ihre Projekte in einer Lösung auflisten möchten, versuchen Sie Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -Filter Newtonsoft.Json}
Folgendes
1
@EdwardMMeshur ist ein sehr guter Befehl, der jedoch nicht genau mit dem Paketnamen übereinstimmt. Hier ist eine leicht aktualisierte für genaue ÜbereinstimmungGet-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' }
Dark_Knight
12

Wenn Sie ein Paket über mehrere Lösungen installiert werden sollen ich tut es einen handlichen Powershell - Skript geschrieben, siehe hier .

Sie können den Get-Project -AllBefehl sogar filtern und auf eine Teilmenge der Projektliste abzielen.

Aaron Powell
quelle
8

Sie sollten die "Add Library Package Reference" für alle Ihre externen Bibliotheken für jedes Projekt in Ihrer Lösung verwenden. Am Ende erhalten Sie eine packages.config pro Projekt.

Sie werden das Paket jedoch nur einmal herunterladen und lokal für alle anderen Projekte wiederverwenden.

Nekresh
quelle
4
Hinweis: Wenn Sie nicht alle Bibliothekspakete aktualisieren, erhalten Sie 3 verschiedene Versionen derselben Assembly. .NET kann mit 3 verschiedenen Versionen arbeiten, wenn sie sich im GAC befinden oder unterschiedliche Namen haben. Aber weil sie den gleichen Namen haben werden. Sie erhalten nicht funktionierende Builds, da die alte Version über die neuere Version kopiert wurde.
Graffic
2

In Package Manager Console können Sie den folgenden Befehl schreiben :

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

Sie können diesen Befehl auch für die Installation oder Aktualisierung verwenden (Update-Package)

Dunkler Ritter
quelle