NuGet-Paketwiederherstellung funktioniert nicht

165

Ich habe ein Projekt auf einem Computer eingecheckt, auf einem anderen ausgecheckt und festgestellt, dass die von NuGet installierten Binärdateien fehlen. Ich könnte sie auch in die Quellcodeverwaltung einchecken, aber es sieht so aus, als gäbe es eine bessere Lösung:

http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

Ich habe diese Anweisungen befolgt, habe jetzt einen .nugetOrdner, in dem sich einer befinden sollte, und habe die folgenden Einträge in meiner .csproj-Datei:

<RestorePackages>true</RestorePackages>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />

und doch, wenn ich meine Lösung neu erstelle, werden die fehlenden Pakete nicht wiederhergestellt.

Was vermisse ich? Wie kann ich dieses Problem diagnostizieren?

Eric J.
quelle
Sehen Sie, dass nuget.exe im Ausgabeprotokoll ausgelöst wird?
Pranav
Und was wichtig ist: Werden im Ausgabeprotokoll Fehler angezeigt?
Maartenba

Antworten:

272

Beachten Sie, dass Sie die Ausführung der Paketwiederherstellung erzwingen können, indem Sie die folgenden Befehle in der Nuget-Paketmanager-Konsole ausführen

Update-Paket-Neu installieren

Erzwingt die Neuinstallation von allem in der Lösung.


Update-Paket -Reinstall -ProjectName myProj

Erzwingt die Neuinstallation von allem im myProj-Projekt.

Hinweis : Dies ist die nukleare Option. Wenn Sie diesen Befehl verwenden, erhalten Sie möglicherweise nicht dieselben Versionen der von Ihnen installierten Pakete, was zu Problemen führen kann. Dies ist auf Projektebene weniger wahrscheinlich als auf Lösungsebene.

Mit der -safeBefehlszeilenparameteroption können Sie Upgrades auf neuere Versionen mit derselben Haupt- und Nebenversionskomponente beschränken. Diese Option wurde später hinzugefügt und behebt einige der in den Kommentaren genannten Probleme.

Update-Paket - Neu installieren - Sicher

Chris Marisic
quelle
7
@ NightOwl888, das klingt nach etwas, das Nuget gemeldet werden muss, da es auf keinen Fall möglich ist, dies zu tun, es sei denn, Sie hatten tatsächlich immer Probleme mit der Höllenbindung der DLL und zum Glück funktionierte es, aber durch die Neuinstallation endete Ihr Glück, dass es funktionierte.
Chris Marisic
4
@nightowl Wenn Sie die Quellcodeverwaltung verwenden, sollte es nicht so schwierig sein, die Änderungen zurückzusetzen.
ErikE
4
Der Hauptnachteil hierbei ist, dass Paketversionen nicht verwaltet werden, sodass die neueste Paketversion installiert wird. Dies kann ein Problem sein, wenn Ihr Projekt nicht mit einer neuen Version kompatibel ist.
JDandChips
4
Ja, das Update-Paket-Neuinstallation hat bei mir funktioniert. Ich habe keine Ahnung, warum die IDE das einfach nicht macht. Alles ist richtig eingestellt. Ich schwöre, NuGet ist sowohl gut als auch nervig.
Jeremy Ray Brown
2
nett von dir, dass du unten in deiner Antwort das "Wichtig! Dies könnte dein Projekt zerstören" hinzufügst!
Devman
25

Für andere, die über diesen Beitrag stolpern, lesen Sie dies.

NuGet 2.7+ führte uns in die automatische Paketwiederherstellung ein . Dies wird für die meisten Anwendungen als viel besserer Ansatz angesehen, da der MSBuild-Prozess nicht manipuliert wird. Weniger Kopfschmerzen.

Einige Links für den Einstieg:

Dave New
quelle
2
Vielen Dank für eine Antwort, die der aktuellen Version von NuGet entspricht.
Eric J.
20

Sie müssen eine der folgenden Möglichkeiten wählen:

Neuinstallation eines Pakets nach seinem Namen in allen Lösungsprojekten:

Update-Package –reinstall <packageName>

Neuinstallation eines Pakets anhand seines Namens und Ignorieren seiner Abhängigkeiten in allen Projekten der Lösung:

Update-Package –reinstall <packageName> -ignoreDependencies

Neuinstallation eines Pakets anhand seines Namens in einem Projekt:

Update-Package –reinstall <packageName> <projectName>

Neuinstallation aller Pakete in einem bestimmten Projekt:

Update-Package -reinstall -ProjectName <projectName>

Neuinstallation aller Pakete in einer Lösung:

Update-Package -reinstall 
Mohammad Dayyan
quelle
Ich habe mein Problem schnell und schmutzig gelöst.
Blackorchid
20

Haben Sie den Paketwiederherstellungsmodus in dem Projekt aktiviert, in dem die Pakete / Binärdateien fehlen? Es ist ein Problem bekannt, bei dem die Pakete korrekt installiert sein müssen, wenn der Wiederherstellungsmodus aktiviert wird:

http://nuget.codeplex.com/workitem/1879


Der ursprüngliche Link ist tot. Dies könnte ein Ersatz sein: https://github.com/NuGet/Home/issues/1968

Alexandre Dion
quelle
3
Danke für den Link. Das Aktivieren des Paketwiederherstellungsmodus in einem Projekt mit fehlenden Paketen / Binärdateien ist ein häufiger Fall. Wenn Sie die Pakete nicht haben, möchten Sie sie erhalten. Anwendungsfall fehlgeschlagen.
Anthony
2
Was meinen Sie, wenn Sie "Paketwiederherstellungsmodus in dem Projekt aktivieren, in dem die Pakete fehlen"? Gibt es einen Konsolenbefehl, den ich ausführen muss, um das zu tun?
CodeWarrior
90
NuGet versagt mir täglich, ich verachte es total.
Jammer
14

VS 2017

Extras> NuGet Package Manager> Package Manager-Einstellungen> Allgemein Klicken Sie auf "Alle NuGet-Caches löschen".

Niaz Morshed
quelle
Beim Auschecken einer Lösung außerhalb der Quellcodeverwaltung (verwaltet mit dem Visual Studio Team Explorer mit DevOps / Git) waren Builds aufgrund fehlender Referenzen nicht möglich, und Wiederherstellungspakete haben nichts unternommen. Diese Lösung war die richtige für diesen Umstand.
PJRobot
12

Ich bin in zwei Szenarien auf dieses Problem gestoßen.

Erstens, wenn ich versuche, meine Lösung über die Befehlszeile mit msbuild.exe zu erstellen. Zweitens, wenn ich versuche, das sln und die enthaltenen Projekte auf meinem Build-Server mit TFS und CI zu erstellen.

Ich erhalte Fehler, die behaupten, dass Referenzen fehlen. Wenn ich sowohl mein lokales Build-Verzeichnis als auch das des TFS-Servers überprüfe, sehe ich, dass der Ordner / packages nicht erstellt wird und die Nuget-Pakete nicht kopiert werden. Befolgen Sie die Anweisungen in Alexandres Antwort http://nuget.codeplex.com/workitem/1879 hat auch bei mir nicht funktioniert.

Ich habe die Wiederherstellung von Paketen über VS2010 aktiviert und festgestellt, dass Builds nur innerhalb von VS2010 funktionieren. Auch hier schlägt die Verwendung von msbuild fehl. Meine Problemumgehung ist wahrscheinlich völlig ungültig, aber für meine Umgebung funktionierte alles über einen lokalen Befehlszeilen-Build sowie über einen CI-Build in TFS.

Ich ging in. \ Nuget und änderte diese Zeile in der Datei .nuget \ NuGet.targets:

von:

<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" -o "$(PackagesDir)"</RestoreCommand>

zu: (beachten Sie, ohne die Anführungszeichen um die Variablen)

<RestoreCommand>$(NuGetCommand) install $(PackagesConfig) -source $(PackageSources) -o $(PackagesDir)</RestoreCommand>

Ich verstehe, dass wenn meine Verzeichnisse Leerzeichen enthalten, dies fehlschlägt, aber ich habe keine Leerzeichen in meinen Verzeichnissen, und diese Problemumgehung hat dazu geführt, dass meine Builds erfolgreich abgeschlossen wurden ... vorerst.

Ich werde sagen, dass das Aktivieren der Protokollierung auf Diagnoseebene in Ihrem Build dazu beiträgt, zu zeigen, welche Befehle von msbuild ausgeführt werden. Dies hat mich dazu gebracht, die Zieldatei vorübergehend zu hacken.

PerryM
quelle
Ich hatte das Problem mit den doppelten Anführungszeichen und musste die gleiche Bearbeitung vornehmen wie Sie. Sehr frustrierend!
Greg
5

Wenn etwas anderes nicht funktioniert hat, versuchen Sie:

  1. Projekt schließen.
  2. Löschen Sie den Paketordner in Ihrem Lösungsordner.
  3. Öffnen Sie das Projekt erneut und stellen Sie die Nugget-Pakete wieder her.

Hat für mich gearbeitet und es ist einfach zu versuchen.

Loaderon
quelle
2
Das hat bei mir funktioniert. In Schritt 3 musste ich die Pakete nicht manuell wiederherstellen - sie wurden automatisch wiederhergestellt, wenn ich das Projekt öffnete.
Tawab Wakil
5

Wenn keine der anderen Antworten für Sie funktioniert, versuchen Sie Folgendes, was das einzige war, was für mich funktioniert hat:

Finde deinen .csproj Datei und bearbeiten Sie sie in einem Texteditor.

Finden Sie das <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">Tag in Ihrem.csproj Datei und löschen Sie den gesamten Block.

Installieren Sie alle Pakete in der Lösung erneut:

Update-Package -reinstall

Danach sollten Ihre Nuget-Pakete wiederhergestellt werden. Ich denke, dies ist ein Randfall, der nur auftritt, wenn Sie Ihr Projekt an einen anderen Ort verschieben.

Jako Basson
quelle
Das hat mich davor bewahrt, völlig verrückt zu werden. Vielen Dank!
Jeff Hay
4

Nur für andere, bei denen dieses Problem auftreten könnte, konnte ich das Problem beheben, indem ich Visual Studio schloss und das Projekt erneut öffnete. Beim Laden des Projekts wurden die Pakete während der Initialisierungsphase wiederhergestellt.

Mike Perrenoud
quelle
4

Für mich hatte ich ein leeres Tag NuGetPackageImportStamp in .csproj

<NuGetPackageImportStamp>
    </NuGetPackageImportStamp>

Es sollte idealerweise eine gültige GUID enthalten.

Das Entfernen des oben genannten Tags und dann "Restore Nugets" funktionierte für mich.

anu
quelle
1

Manchmal passiert etwas Seltsames und die automatische Wiederherstellung mit Visual Studio funktioniert nicht. In diesem Fall können Sie die NuGet Package Manager-Konsole verwenden. Dies wird in Visual Studio über Tools -> NuGet Package Manager -> Package Manager Console geöffnet . Die Befehle in der Konsole sind einfach. Wenn Sie beim Eingeben eines Befehls Hilfe zum Kontext erhalten möchten, drücken Sie einfach die Taste. Sie erhalten dann alle Optionen, die mit den eingegebenen Buchstaben beginnen. Wenn also kein Paket installiert ist, z. B. log4net, geben Sie den folgenden Befehl ein:

Install-Package log4net

Sie können noch viel mehr tun, z. B. die zu installierende Version angeben, ein Paket aktualisieren, ein Paket deinstallieren usw.

Ich musste die Konsole benutzen, um mir zu helfen, wenn Visual Studio sich wie ein Verrückter verhielt.

Jeremy Ray Brown
quelle
1

Die automatische Paketwiederherstellung schlägt aus einem der folgenden Gründe fehl:

  1. Sie haben die Dateien NuGet.exe und NuGet.targets nicht aus dem .nuget-Ordner der Lösung entfernt (der sich in Ihrem Lösungsstammordner befindet).
  2. Sie haben die automatische Paketwiederherstellung über die Extras >> Optionen >> Nuget Package Manager >> Allgemeine Einstellungen nicht aktiviert.
  3. Sie haben vergessen, Verweise in all Ihren Projekten auf die Datei Nuget.targets manuell zu entfernen
  4. Sie müssen Visual Studio neu starten (stellen Sie sicher, dass der Prozess von Ihrem Task-Manager abgebrochen wird, bevor Sie ihn erneut starten).

Der folgende Artikel beschreibt ausführlicher, wie Sie mit den Punkten 1-3 umgehen: https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore

CShark
quelle
1
In Bezug auf Ihren ersten Punkt widerspricht der von Ihnen angegebene Link Ihrem Rat: "Wenn Sie TFS verwenden 1. Entfernen Sie die Dateien NuGet.exe und NuGet.targets aus dem Ordner .nuget der Lösung. 2. Behalten Sie die Datei NuGet.Config bei, um die Umgehung fortzusetzen Hinzufügen von Paketen zur Quellcodeverwaltung. "
Andrew Dennison
1

Ich hatte NuGet-Pakete kaputt, nachdem ich eine Systemwiederherstellung auf meinem System durchgeführt und es ungefähr zwei Tage lang gesichert hatte. (Die NuGet-Pakete wurden inzwischen installiert.) Um dies zu beheben, musste ich in meinem Benutzerprofil zum Ordner .nuget \ packages gehen, die Pakete suchen und löschen. Nur dann würde Visual Studio die Pakete frisch herunterziehen und sie ordnungsgemäß als Referenzen hinzufügen.

Aaron
quelle
1

Die beste Problemumgehung, die ich gefunden habe, um ein neues Projekt von Grund auf neu zu erstellen und dann alle Quelldateien mit dem Code zu importieren. Mein Projekt war nicht so kompliziert, so dass ich von dort aus kein Problem hatte.

Martin Deivid
quelle
1

Keine der anderen Lösungen hat in meiner Situation funktioniert:

AspNetCore-Abhängigkeiten wurden installiert / deinstalliert und wurden zwischengespeichert. 'AspNetCore.All' würde sich weigern, ordnungsgemäß zu aktualisieren / neu zu installieren / zu entfernen. Und unabhängig davon, was ich getan habe, wurden die zwischengespeicherten Abhängigkeiten verwendet (mit denen es nicht kompatibel war), da es sich um eine höhere Version handelte.

  1. Alles sichern. Beachten Sie die Liste der Abhängigkeiten, die Sie neu installieren müssen. Beenden Sie VisualStudio
  2. Öffnen Sie alle .proj-Dateien in einem Texteditor und entfernen Sie alle PackageReference
  3. Löschen Sie in jedem Projekt die bin,obj Ordner
  4. Löschen Sie alle "Paket" -Ordner, die Sie in der Lösung finden.
  5. Lösung öffnen, in Tools > Nuget Package Manager > Package Manager Settingsund gehenClear all Nuget caches . Überprüfen Sie die Konsole, da einige Elemente möglicherweise nicht entfernt werden können. Kopieren Sie den Ordnerpfad und beenden Sie Visual Studio.
  6. Löschen Sie alles aus diesem Ordner. Öffnen Sie die Lösung erneut und beginnen Sie erneut mit der Installation der Nuget-Pakete.

Wenn dies immer noch nicht funktioniert, wiederholen Sie den nugetVorgang, durchsuchen Sie aber auch Ihr Laufwerk im Windows Explorer und löschen Sie alles, was nach Cache aussieht.

jv_
quelle
0

vs2015 kein Problem beim Aktivieren der Nuget-Wiederherstellung. Meine Lösung:

  1. Ordner .nuget hinzufügen, Datei NuGet.Config und NuGet.targets im Verzeichnis .nuget hinzufügen

  2. Jede Projektdatei add: build

  <RestorePackages>true</RestorePackages>

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
  </Target>
方 权 军
quelle
Dies ist die alte Art, es zu tun. Siehe @ Ravenewza Antwort und seinen Link zu blog.davidebbo.com/2014/01/…
timB33
0

Wenn der Fehler, mit dem Sie konfrontiert sind, darin besteht, dass keine Verbindung zum Remote-Server hergestellt werden kann, wie es bei mir der Fall war, ist es von Vorteil, wenn Sie diese Prüfung zusätzlich zu den in den obigen Kommentaren angegebenen Prüfungen durchführen lassen.

Ich habe gesehen, dass es 2 NUGET-Paketquellen gibt, von denen die Pakete heruntergeladen werden können (unter Tools-> Nuget Package Manager-> Packager Manager-Einstellungen). Eine der Paketquellen funktionierte nicht und Nuget versuchte, nur von dieser Quelle herunterzuladen.

Die Dinge passten zusammen, als ich die Paketquelle zum Herunterladen von https://www.nuget.org/api/v2/ EXPLICTLY in den Einstellungen änderte

vamsee
quelle
0

In meinem Fall hatte ein abgebrochener Nuget-Wiederherstellungsversuch eine der packages.configDateien in der Lösung beschädigt . Ich habe dies nicht entdeckt, bevor ich meinen Git-Arbeitsbaum überprüft habe. Nach dem Zurücksetzen der Änderungen in der Datei funktionierte die Nuget-Wiederherstellung wieder.

Frederik Struck-Schøning
quelle
0

Es gibt eine Verknüpfung, mit der die Nuget-Wiederherstellung funktioniert. 1. Stellen Sie sicher, dass die Internetverbindung oder die Nuget-URLs im Optionsmenü von VS Tools korrekt sind. 2. Sehen Sie sich den .nuget- oder Nuget-Ordner in der Lösung an

  1. LÖSCHEN Sie Paketordner, falls vorhanden

  2. Öffnen Sie die Paketmanagerkonsole und führen Sie diesen Befehl aus

    • Füge den vollständigen Pfad der Datei nuget.exe ein. WIEDERHERSTELLEN des vollständigen Pfads der SLN-Datei!
  3. Verwenden Sie den Befehl Install-pacakge, wenn der Build für fehlende Referenzen nicht durchgekommen ist. Hoffe es hilft (HIH)
HydTechie
quelle
0

Klicken Sie in VS2017 mit der rechten Maustaste auf die Lösung => Befehlszeile öffnen => Entwicklerbefehlszeile.

Sobald das geöffnet ist, geben Sie ein (und drücken Sie die Eingabetaste danach).

dotnet restore

Dadurch werden alle Pakete wiederhergestellt, und Sie erhalten eine schöne Konsolenausgabe dessen, was getan wurde ...

James Joyce
quelle