2016-06-29 16 views
3

Ich habe viele der Antworten auf SO und NuGet (und das Internet im Allgemeinen, wirklich) gelesen, aber ich kann nicht scheinen, das Problem zu überwinden, das ich mit NuGet-Paket habe Wiederherstellen in Visual Studio 2015. Ich habe die folgenden Szenarien.Wiederherstellen aller Nuget-Pakete in einer Visual Studio 2015-Lösung

Lösung A Struktur

--project A

Wenn ich öffnen und bauen Lösung A Ich sehe das Dialogfeld, das die nuget Paket Fortschritt wiederherzustellen zeigt, und die Lösung wird erfolgreich erstellt.

Lösung B Struktur

--project A

--project B

jedoch davon aus, dass ich nie Lösung A (dh frisch Pull von TFS) aufgebaut haben, wenn ich öffnen und Erstellen von Solution BI siehe das Dialogfeld, in dem der Fortschritt der Wiederherstellung des Nuget-Pakets angezeigt wird, das Build jedoch fehlschlägt, da Projekt A nicht erstellt werden kann.

Es scheint, dass NuGet die Pakete für Projekt B wiederherstellt, aber nicht für Projekt A, also den Build-Fehler. Wenn ich mir die Referenzen für Projekt B anschaue, haben sich zwar alle NuGet-Referenzen aufgelöst, aber die Referenzen für Projekt A sind immer noch gebrochen.

Einige Punkte:

  • Ich habe Integration deaktiviert Quellcodeverwaltung für NuGet so Überprüfung ich nicht Ordner in der Packages bin.
  • Jedes Projekt hat seine eigene packages.config Datei
  • Die Build-Reihenfolge in Lösung B ist Projekt A Projekt dann B

Gedanken würden sehr geschätzt.

+0

Können Sie den relevanten Text aus Ihren .csproj-Dateien und Ihren packages.config-Dateien anzeigen? –

+0

Ya, wir haben dasselbe Problem, es ist fast so, als wären die project.json-Dateien verwirrt. Wir haben alles versucht, indem wir auf der Ebene "Lösung" hinzugefügt und auf der Ebene "Nur Projekt" hinzugefügt haben. Es scheint, sobald ein Projekt in mehr als einer Lösung involviert ist, geht Nuget drunter und drüber. In der Tat wird es Ihnen sagen, dass das Zeug bereits installiert ist, auch wenn der Referenzbereich einen gelben Indikator deutlich zeigt. Nuget ist in den letzten 6 Monaten zu einem Durcheinander geworden ... Über alles, was Sie tun können, ist eine Neuinstallation, wenn Sie es tun müssen, klicken Sie einfach auf Manage Nuget deinstallieren, dann gehen Sie online, um das Paket zu finden und neu zu installieren. –

+0

Ich habe Ihre Antwort aus Ihrer Frage entfernt, da Fragen keine Antworten enthalten sollten. Ich habe eine [Wiki-Antwort] (https://Stackoverflow.com/a/45106397/542251) mit den Details hinzugefügt. Wenn Sie die Antwort selbst hinzufügen möchten, lassen Sie es mich wissen und ich werde das Wiki löschen] – Liam

Antwort

5

Standardmäßig erstellt NuGet den Ordner packages der Lösung im Lösungsstammverzeichnis, und jedes Projekt verweist seine Paket-DLLs auf diesen "lokalen" Paketordner. Wenn Sie in Ihrem Beispiel die .csproj-Datei für Projekt A öffnen, werden Sie wahrscheinlich feststellen, dass der Referenzpfad etwa ..\packages\[package name]\[etc] ist.

Wenn Sie also einen neuen Pull von TFS ziehen und Lösung B erstellen, kann Project A seine DLLs nicht finden, weil c:\workspace\Solution A\packages noch nicht existiert (oder was auch immer der absolute Pfad auf Ihrem Computer ist).

Um dies zu korrigieren, verwenden Sie einen freigegebenen Paketordner, erstellt unter c:\workspace\packages. Um dies zu tun, müssen Sie in jeder Lösung einen zusätzlichen Knoten zum NuGet.config hinzufügen (siehe https://docs.nuget.org/consume/nuget-config-file für Details, und ich auch gehe davon aus Sie einen NuGet Ordner bei c:\workspace\Solution A\.nuget haben):

<config> 
    <add key="repositorypath" value="..\..\packages" /> 
</config> 

ich verwenden, um einen relativen Pfad hier, aber Sie können auch einen absoluten Pfad verwenden, und die Dokumentation besagt, dass Sie auch %HOME% verwenden können.

Tun Sie dies und starten Sie Visual Studio neu. Beim nächsten Öffnen des Paketmanagers sollten Sie gefragt werden, ob Sie fehlende Pakete wiederherstellen möchten. Wenn Sie auf "Ja" klicken, werden sie an den neuen Speicherort verschoben.Der letzte Schritt besteht darin, die .csproj-Datei zu bearbeiten und alle Instanzen von ..\packages in ..\..\packages zu ändern (oder Sie können das Paket deinstallieren und neu installieren, aber ich finde die Bearbeitung des .csproj sehr viel schneller).

+0

Danke! Dies hat mein Problem behoben, als ich die Lösung lokal herunterzog, aber jetzt, wenn ich einen Build auf dem Build-Server trete, werden nur die Pakete von Lösung A wiederhergestellt und Lösung B schlägt fehl. Wenn ich mich beim Build-Server anmelde und die Lösung B in Visual Studio öffne und manuell ein Build durchführe, werden die Pakete ordnungsgemäß wiederhergestellt und der Build ist erfolgreich. Die Buildreihenfolge in meiner Builddefinition lautet Lösung A -> Lösung B. Irgendwelche Ideen? – dparsons

+0

Nicht berücksichtigen. Ich konnte das Problem lösen und habe meine ursprüngliche Frage mit der Gesamtlösung aktualisiert. – dparsons

2

Um nuget Pakete tun folgende Schritte wiederherstellen:

  • ändern Zielframework in Projekteigenschaften
  • Rein Projekt
  • Sets vorheriges Ziel Rahmen
  • Projekt neu

Ich hoffe, Es wird helfen.

+0

Nein Es funktioniert nicht :( –

+0

In meinem Fall funktioniert es. Ich hoffe, dass sie dieses Problem in VS2017 entfernen werden. –

0

von OPs Genommen Frage

howcheng's answer mit einigen Einschränkungen im Allgemeinen korrekt ist. Nach der Implementierung der Änderungen, die Howcheng vorgeschlagen hatte, war ich in der Lage, alle meine Lösungen lokal zu erstellen, indem ich einen zentralen "Paketordner" verwendete, den alle Projekte unabhängig von der Lösung betrachten. Das Problem, auf das ich stieß, war, dass, als ich diese Änderungen in TFS überprüfte, mein CI-Build gestartet und fehlgeschlagen ist!

Meine CI-Builddefinition erstellt sowohl Lösung A als auch Lösung B als Teil der Standard-XAML-Prozessvorlage, keine .proj-Datei. Die Fehler, die ich sah, schienen darauf hinzuweisen, dass Lösung A ihre Pakete wiederherstellte, aber Lösung B nicht. Wenn ich mich auf dem Build-Server angemeldet und Lösung B in VS 2015 geöffnet habe, hat alles funktioniert; Nach ein paar Stunden Googeln bin ich auf this Artikel gestoßen, der mich zu meiner Antwort geführt hat.

Ich entwickle in Visual Studio 2015, aber ich verwende TFS 2013 für die Quellcodeverwaltung und Builds. Trotz der Tatsache, dass Visual Studio 2015 auf dem Build-Server installiert ist, verweist MSBuild immer noch auf die Version von NuGet, die mit TFS 2013 ausgeliefert wurde, und nicht mit der Version von VS 2015. Nachdem ich nuget update -self aus dem TFS Tools-Verzeichnis ausgeführt hatte, funktionierte mein Build ordnungsgemäß .

Verwandte Themen