Wie bringe ich NuGet dazu, alle Pakete in der packages.config zu installieren / aktualisieren?

673

Ich habe eine Lösung mit mehreren Projekten. Die meisten Referenzen von Drittanbietern fehlen, es gibt jedoch packages.configDateien für jedes Projekt. Wie bringe ich NuGet dazu, alle benötigten Pakete zu installieren / zu aktualisieren? Muss dies für jedes Projekt über die Befehlszeile erfolgen?

Samuel G.
quelle
10
Bitte überlegen Sie, die akzeptierte Antwort zu ändern, da NuGet jetzt viel besser in Visual Studio integriert ist und es einfachere Möglichkeiten gibt, dieses Problem zu lösen.
Skolima
2
Mit der neuesten NuGet 2.5-Version gibt es jetzt eine Schaltfläche "Alle aktualisieren
Erik Schierboom
@ErikSchierboom Danke! Dieser Thread sollte aktualisiert werden, da dieser jetzt verfügbar ist
Karl Cassar
In Verbindung stehendes Projekt : ocolatey.org
Jayan
1
Zum Nutzen der Suchenden können Sie in VS2013 mit der rechten Maustaste auf die Lösung klicken und "NuGet-Paketwiederherstellung aktivieren" auswählen. Dann bauen.
HockeyJ

Antworten:

870

Sie können nuget.exe verwenden , um Ihre Pakete wiederherzustellen, oder mit NuGet 2.7 oder höher können Sie Ihre Lösung einfach in Visual Studio kompilieren, wodurch auch die fehlenden Pakete wiederhergestellt werden.

Für NuGet.exe können Sie für jedes Projekt den folgenden Befehl ausführen.

nuget install packages.config

Oder mit NuGet 2.7 können Sie alle Pakete in der Lösung über die Befehlszeile wiederherstellen .

nuget restore YourSolution.sln

Beide ziehen die Pakete herunter. Ihre Projektdateien werden jedoch nicht geändert, wenn Sie diesen Befehl ausführen, sodass das Projekt bereits einen Verweis auf die NuGet-Pakete enthalten sollte. Ist dies nicht der Fall, können Sie die Pakete mit Visual Studio installieren.

Ab NuGet 2.7 stellt Visual Studio fehlende NuGet-Pakete automatisch wieder her, wenn Sie Ihre Lösung erstellen, sodass NuGet.exe nicht verwendet werden muss.

Um alle Pakete in Ihrer Lösung zu aktualisieren, stellen Sie sie zuerst wieder her. Anschließend können Sie entweder mit NuGet.exe die Pakete aktualisieren oder in Visual Studio die Pakete über das Fenster "Package Manager Console" aktualisieren oder schließlich "Verwalten" verwenden Paketdialog.

Über die Befehlszeile können Sie Pakete in der Lösung auf die neueste Version aktualisieren, die auf nuget.org verfügbar ist.

nuget update YourSolution.sln

Beachten Sie, dass hierdurch keine PowerShell-Skripts in NuGet-Paketen ausgeführt werden.

In Visual Studio können Sie die Paketmanager-Konsole verwenden, um auch die Pakete zu aktualisieren. Dies hat den Vorteil, dass alle PowerShell-Skripts als Teil des Updates ausgeführt werden, wenn sie bei Verwendung von NuGet.exe nicht ausgeführt werden. Der folgende Befehl aktualisiert alle Pakete in jedem Projekt auf die neueste Version von nuget.org.

Update-Package

Sie können dies auch auf ein Projekt beschränken.

Update-Package -Project YourProjectName

Wenn Sie die Pakete auf die gleichen Versionen wie zuvor installieren möchten, können Sie das -reinstallArgument mit dem Update-PackageBefehl verwenden.

Update-Package -reinstall

Sie können dies auch auf ein Projekt beschränken.

Update-Package -reinstall -Project YourProjectName

Die -reinstallOption wird zuerst deinstalliert und dann das Paket wieder in einem Projekt installiert.

Sie können die Pakete auch über den Manage PackagesDialog aktualisieren .

Aktualisierung:

  • 10.07.2013 - Aktualisiert mit Informationen zur Nuget-Wiederherstellung in NuGet 2.7
  • 06.07.2014 - Aktualisiert mit Informationen zur automatischen Paketwiederherstellung in Visual Studio und Aktualisierung der Antwort mit anderen Änderungen an NuGet.
  • 21.11.2014 - Aktualisiert mit Informationen über-reinstall
Matt Ward
quelle
15
Gibt es in Visual Studio einen einfachen Befehl, um dies zu tun? Ich habe die automatische Wiederherstellung für die Lösung aktiviert, aber "Build" gibt mir aufgrund fehlender Referenzen immer noch viele Fehler (Pakete wurden nicht aus packages.config wiederhergestellt).
Borek Bernard
1
Ich denke nicht, ohne etwas wie NuGet Power Tools zu installieren - github.com/davidfowl/NuGetPowerTools . Dies entspricht jedoch im Wesentlichen der automatischen Wiederherstellung, die Sie bereits haben.
Matt Ward
2
Dies funktioniert auch für die Installation von Paketen im Allgemeinen, nicht nur um sie "wiederherzustellen" (kein großer technischer Unterschied, da die IS-Installation wiederhergestellt wird; es ist jedoch nicht auf Personen beschränkt, die die Funktion zur Wiederherstellung von Lösungspaketen verwenden möchten). Zu diesem Zweck müssen Sie jedoch eine Umgebungsvariable EnableNuGetPackageRestore festlegen. Ich habe es in meinem psake-Skript festgelegt, bevor ich "nuget install packages.config" wie folgt aufrufe: $ env: EnableNuGetPackageRestore = "true". Dadurch wird die Variable für den PS-Prozess und die von ihm erzeugten Prozesse festgelegt, ohne dass dies Auswirkungen auf die maschinenweiten Variablen (und möglicherweise andere Builds) hat.
Galaktor
Das Wiederherstellen ist nicht ganz dasselbe wie das Installieren. Durch das Installieren eines Pakets über die Befehlszeile wird Ihr Projekt nicht geändert, sodass beispielsweise Assemblyreferenzen nicht hinzugefügt werden.
Matt Ward
3
Ich muss mindestens eine Stunde damit verbracht haben, nach einer Lösung zu suchen, und schließlich war es tatsächlich soUpdate-Package -reinstall -Project ProjectName
Wiz
528

Installieren Sie alle Pakete in ALL PROJECTS der aktuellen Lösung neu:

Update-Package -Reinstall

Installieren Sie alle Pakete in SPECIFIC PROJECT der aktuellen Lösung neu ( dank Unarity und Asche999 ):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Rodolpho Brock
quelle
60
Ich denke, das ist wirklich das, was das OP wollte, und viel einfacher als alle anderen Lösungen ...
Jaminto
4
Dies ist die Nuke-Option, wenn Sie sie nur benötigen, um JETZT zu arbeiten.
Chris
11
Dies ist auch die perfekte Option, wenn Sie gerade Ihr Ziel-Framework oder ähnliches geändert haben. Ich hatte die Aussicht, 25 ungerade Projekte mit vielen Nuget-Paketen aktualisieren zu müssen, und der erste Befehl war perfekt für das, was ich wollte. Und nicht einmal Nuke im Overkill-Sinne.
Chris
7
Dies sollte die Antwort auf diese Frage sein, die akzeptierte Antwort funktioniert, aber dies beantwortet speziell die Frage. +1 für genau das, was benötigt wurde.
Krystan Ehre
10
Möglicherweise möchten Sie sogar den Schalter -IgnoreDependencies hinzufügen. Ich habe einen Update-Package-Fehler gehabt, weil eine Abhängigkeit von einem der von mir verwendeten Pakete in einer neueren Version bestand als in meiner packages.config angegeben
Mathias Falkenberg
167

Es gibt eine andere, neuere und schnellere Möglichkeit, dies in Visual Studio zu tun. Schauen Sie sich diesen Beitrag von David Ebbo an und lesen Sie den Kommentarbereich, wenn Sie auf Probleme stoßen. Grundsätzlich gehen Sie in der Eingabeaufforderung des Paketmanagers wie folgt vor:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

Wenn Sie anschließend Ihre Lösung erstellen, werden die Pakete automatisch installiert, wenn sie fehlen.

Aktualisieren:

Diese Funktionalität ist in Nuget 1.6 mit Visual Studio-Integration integriert, sodass Sie nicht einmal NuGetPowerTools installieren oder Befehle eingeben müssen. Alles was du tun musst, ist

Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Knoten Lösung und wählen Sie NuGet-Paketwiederherstellung aktivieren.

Lesen Sie diesen Artikel für weitere Details.

Alex
quelle
6
Die aktualisierte Antwort hier wird für die meisten Benutzer die beste Lösung sein, da sie nicht über nuget.exe verfügen (aber nuget in Visual Studio installiert haben).
Tod Thomson
1
Aber die Paketwiederherstellung lädt tatsächlich nuget.exe für Sie herunter
Konstantin
4
Ich habe das gerade gemacht. und es schlägt immer noch fehl, wenn der Build besagt, dass Referenzen fehlen. Laut Build sind alle Pakete bereits installiert. Ich habe in den Ordner "Lösung / Pakete" die betreffenden Pakete gelöscht und sie heruntergeladen und funktioniert.
Maslow
3
@Shy auf diese Weise ist jetzt zugunsten einer Lösung veraltet, die nicht alle Ihre Projektdateien ändert.
Der Muffin-Mann
20

Hier ist eine weitere Lösung, wenn Sie Website-Projekte verwenden oder die Wiederherstellung von NuGet-Paketen nicht aktivieren möchten.

Mit der Paketmanagerkonsole können Sie alle Pakete in der Datei package.config auflisten und erneut installieren.

# 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
quelle
4
Ich habe jede der oben genannten Antworten ausprobiert und konnte sie nicht dazu bringen, an einer meiner Lösungen zu arbeiten. Aber eine Variation davon tat es. $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
PerryJ
1
Die Wiederherstellung von Nuget-Paketen ist ein Albtraum, wenn Sie mehrere Lösungen auf demselben Programm verwenden ... Ich begrüße diese Antwort!
Felickz
1
Das hat mein Problem nicht behoben, aber ich habe mich sicher besser gefühlt!
Devil's Advocate
Dies ist hervorragend und bietet eine Möglichkeit, Pakete in ein neues Projekt zu migrieren: [xml] $ packages = gc c: \ PathToExisting \ packages.config # gefolgt von # Installieren Sie jedes Paket $ packages.packages.package | % {Install-Package -id $ ($ _. Id) -Version $ ($ _. Version)}
Reckface
1
@PerryJ du hättest einfach tippen können Update-Package -Reinstall.
BrainSlugs83
15
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

Dies ist das beste und einfachste Beispiel, das ich gefunden habe. Es werden alle in packages.config aufgelisteten Nugets neu installiert und die aktuellen Versionen beibehalten. Durch YourProjectNameGoesHereden Projektnamen ersetzen .

Einheit
quelle
Ich hatte einige Probleme damit, weil meine packages.config Verweise auf zwei Pakete mit bestimmten Versionen enthielt, aber ein Paket ohne bestimmte Version vom anderen abhing. Als ich das Update ausführte, deinstallierte es zuerst alle Pakete und schlug dann die Neuinstallation fehl, da auf eine neuere Version der Abhängigkeit "bereits verwiesen" wurde. Das Entfernen hatte jedoch gut funktioniert, sodass meine packages.config jetzt leer war. Ich musste packages.config von der Quellcodeverwaltung zurücksetzen und das widersprüchliche Paket aktualisieren, bevor ich das vollständige Update versuchte ...
Mathias Falkenberg
6

Ich verwende Visual Studio 2015 und die oben angegebenen Lösungen haben bei mir nicht funktioniert. Deshalb habe ich Folgendes getan:

Löschen Sie den Paketordner aus meiner Lösung sowie die Ordner bin und obj aus jedem Projekt in der Lösung und erstellen Sie ihn neu.

Vielleicht haben Sie den nächsten Fehler:

nuget.exe konnte nicht gefunden werden

So lösen Sie dies: Ändern Sie diese Zeile in Ihrer NuGet.targets-Datei und setzen Sie sie auf true:

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

Referenz: https://stackoverflow.com/a/30918648 und https://stackoverflow.com/a/20502049

mejiamanuel57
quelle
4

Wenn Sie Nuget 2.8 installieren, aktivieren Sie das Kontrollkästchen

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

in Visual Studio. Wenn diese Option aktiviert ist, werden durch einfaches erneutes Erstellen des Projekts alle Referenzbibliotheken wiederhergestellt.

Yevgraf Andreyevich Zhivago
quelle
Die bequemste Option über die Benutzeroberfläche von Visual Studio. Sie müssen auch das Kontrollkästchen Allow NuGet to download missing packagesaktivieren.
RBT
4

Nach 3 Stunden Suche und Untersuchung.

Ich hatte Probleme damit, weil wir zwei Mitglieder im Team haben (mit GitHub-Quellcodeverwaltung), weil wir die Dateien für Pakete zum Senden an das Remote-Repository nicht eingeschränkt haben. Eines der Teammitglieder hat Pakete an den Server gesendet, und ich habe diese Änderungen vorgenommen mein Einheimischer.

Danach hatte ich das gleiche Problem wie PO, außerdem konnte ich mein API-Projekt nicht auf dem Server veröffentlichen.

Am und habe ich gerade benutzt

Update-Package -Reinstall - Führen Sie diesen Befehl in der Package Manager-Konsole aus

Dieser Befehl installiert alle Ihre Pakete neu, die Sie in Ihrer Lösung verwendet haben. (Für jedes Projekt)

Installieren Sie alle Pakete in ALL PROJECTS der aktuellen Lösung neu:

Update-Package -ProjectName 'NameOfProject' -Reinstall - Führen Sie diesen Befehl in der Package Manager-Konsole aus

Dieser Befehl installiert alle Ihre Pakete neu, die sich auf ein Projekt beziehen, das Sie nach "-ProjectName" angegeben haben. Und ich denke, dass dies besser ist, weil ich eine halbe Stunde gewartet habe, um alle Pakete in Lösung neu zu installieren.

Dafür vielen Dank an Rodolpho Brock .

Außerdem würde ich Ihnen empfehlen, beim Abrufen von Änderungen vom Remote-Server auf die Schaltfläche "Pakete wiederherstellen" zu klicken, die von Visual Studio angezeigt wird.

Nihad Delic
quelle
3

Ich glaube, das erste, was Sie tun müssen, ist die Paketwiederherstellungsfunktion zu aktivieren . Siehe auch hier . Dies erfolgt auf Lösungsebene (nicht auf Projektebene).

Aber das bringt Sie nicht ganz weiter - ich bin auf ein ähnliches Problem gestoßen, nachdem ich die Wiederherstellungsfunktion aktiviert habe. (VS2013, NuGet 2.8.)

Es stellte sich heraus, dass ich die Pakete (unbeabsichtigt) zur Quellcodeverwaltung verpflichtet hatte, als ich das Projekt festschrieb - aber Visual Studio (und das Versionsverwaltungs-Plugin) hatten die Binärdateien beim Einchecken hilfreich ignoriert.

Das Problem trat auf, als ich einen Release-Zweig erstellte. Meine lokale Kopie des dev / main / trunk-Zweigs hatte die Binärdateien, da ich dort ursprünglich die Pakete installiert / heruntergeladen hatte.
In der neuen Release-Filiale

  • Die Paketordner und .nupkg-dateien waren alle vorhanden. NuGet glaubte also nicht, dass etwas wiederhergestellt werden musste.
  • Gleichzeitig war jedoch keine der DLLs vorhanden - dh die Referenzen von Drittanbietern fehlten -, sodass ich nicht erstellen konnte.

Ich habe alle Paketordner in $(SolutionDir)/packages(unter dem Release-Zweig) gelöscht und dann eine vollständige Neuerstellung ausgeführt. Diesmal war der Build erfolgreich.
... und dann ging ich natürlich zurück und entfernte die Paketordner aus der Quellcodeverwaltung (im Trunk- und Release-Zweig). Mir ist (noch) nicht klar, ob die repositories.configDatei ebenfalls entfernt werden soll.

Viele der von den Projektvorlagen für Sie installierten Komponenten - zumindest für Webprojekte - sind NuGet-Pakete. Das heißt, dieses Problem ist nicht auf Pakete beschränkt, die Sie hinzugefügt haben.
Aktivieren Sie daher die Paketwiederherstellung sofort nach dem Erstellen des Projekts / der Lösung und löschen Sie den packagesOrdner , bevor Sie einen ersten Check-in durchführen (und stellen Sie sicher, dass Sie den .nugetOrdner der Quellcodeverwaltung übergeben).

Haftungsausschluss: Ich habe hier auf SO eine andere Antwort gesehen, die darauf hinwies, dass das Löschen des packagesOrdners Teil der Lösung war. Das hat mich auf den richtigen Weg gebracht, daher möchte ich dem Autor die Ehre erweisen, aber ich kann diese Frage / Antwort nicht mehr finden. Ich werde eine Bearbeitung veröffentlichen, wenn ich darauf stoße.

Ich würde auch bemerken, dass Update-Package -reinstalldie .slnund .csproj/ .vbprojDateien geändert werden. Zumindest hat es das in meinem Fall getan. Welches IMHO macht diese Option viel weniger attraktiv.

David
quelle
Ich hatte genau das gleiche Problem und verbrachte lange Zeit damit, Pakete zu aktualisieren und neu zu installieren, als, wie Sie sagen, nur die lokalen Pakete gelöscht werden mussten.
Thomas Boby
3

Ich habe es versucht, Update-Package -reinstallaber es schlägt bei einem Paket fehl und hat die Verarbeitung aller verbleibenden Projektpakete in meiner Lösung gestoppt.

Am Ende hatte ich mein Skript, das alle package.config-Dateien auflistet und Update-Package -Reinstall -ProjectName prj -Id pkgfür jedes Projekt / Paket ausführt .

Hoffe, es kann für jemanden nützlich sein:

$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] }

Bearbeiten: Dies ist ein Fehler, den ich hatte: Update-Paket: Paket 'EntityFramework.BulkInsert-ef6' konnte nicht gefunden werden. Bestehende Pakete müssen wiederhergestellt werden, bevor eine Installation oder ein Update durchgeführt wird. Manueller Lauf Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 hat sehr gut funktioniert.

Sergei Zinovyev
quelle
2
Vielen Dank. Ich weine vor Freude
Cleftheris
Ich weine auch vor Freude! Ja!! Was für eine Zeitersparnis. Genau wie zu Ihrer Information, wenn Sie diese Zeile anstelle der letzten Zeile in Sergeis Skript verwenden, werden keine Abhängigkeiten installiert. Nur eine direkte Neuinstallation: $ projectPackages | foreach {Update-Package -IgnoreDependencies -Reinstall -ProjectName $ _ [0] -Id $ _ [1]}
ElMatador
2

Für diejenigen, die hier ankommen, weil der Build-Server dies nicht tut, können Sie ein MSBuild-Ziel erstellen, auf dem der Befehl exec ausgeführt wird, um den Befehl nuget restore wie folgt auszuführen (in diesem Fall befindet sich nuget.exe im Ordner .nuget und nicht aktiviert den Pfad), der dann unmittelbar vor dem Erstellen der Lösung in einem TeamCity-Erstellungsschritt ausgeführt werden kann

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

Jetzt bietet Ihnen die Nuget Package Manager-Konsole in Visual Studio 2012 automatisch die Schaltfläche "Wiederherstellen", sobald ein Paket gefunden wird, das nicht installiert ist, sich jedoch in package.config befindet. Fantastisches Feature!

Sunny Sharma
quelle
2
Dies gilt auch für Visual Studio 2010
Paulroho
1

Wenn ich bei VS2012 V11 "-Reinstall" am Ende der Zeile verwende, funktioniert es nicht.

Also habe ich einfach benutzt:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
user3516584
quelle
1

Ich weiß, dass dies ein alter Beitrag ist, dachte aber, dass dies nützlich sein könnte. Wenn Sie bestimmte Pakete während des Aktualisierungsvorgangs ignorieren müssen (wie alle Pakete, die JavaScript-Referenzen aktualisieren), verwenden Sie das folgende PowerShell-Skript (stellen Sie sicher, dass Ihre Paketquelle in der Package Manager-Konsole auf "Alle" eingestellt ist):

BEARBEITEN 25.09.2014 10:55 EST - Ein Fehler im Skript wurde behoben

$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 der Kodierer
quelle
0

In Visual Studio 2017 - Wenn Sie mit IDE kompilieren - werden alle fehlenden Nuget-Pakete heruntergeladen und im Ordner "packages" gespeichert.

Auf der Build-Maschine wurde die Kompilierung jedoch mit msbuild.exe durchgeführt. In diesem Fall habe ich nuget.exe heruntergeladen.

Während jedes Erstellungsprozesses vor der Ausführung von msbuild.exe. Es wird ausgeführt -> nuget.exe wiederherstellen NAME_OF_SLN_File (wenn es nur eine .SLN-Datei gibt, können Sie diesen Parameter ignorieren).

David
quelle
Ich habe festgestellt, dass Sie MSBuild -t: restore auf dem SLN in der Befehlszeile verwenden können, um dies zu tun. MSbuild -t:restore Xxxx.sln
Mike Kelly
0

Ich weiß nicht seit wann, aber in VS2019 können Sie es einfacher machen:

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Lösung
  2. Wählen Sie Nuget-Pakete für Lösung verwalten aus
  3. Es gibt 4 Registerkarten: Durchsuchen, Installiert, Updates, Konsolidieren
  4. Die Konsolidierung zeigt an, ob es Projekte gibt, die unterschiedliche Versionen von Paketen verwenden (und in den meisten Fällen möchten wir deshalb alle Pakete aktualisieren).
  5. Das Update zeigt an, ob in JEDEM Projekt ein Update verfügbar ist. Wählen Sie alle aus und klicken Sie auf Aktualisieren. Der Auftrag wird ausgeführt.
Cheny
quelle