Ich versuche mit MSBuild 12.0 eine Lösung mit packages
fehlendem Inhalt (außer im repositories.config
Inneren) zu erstellen. Ich erwarte, dass alle fehlenden Pakete vor dem Erstellen automatisch wiederhergestellt werden, aber dies ist nicht der Fall - MsBuild meldet Unmengen von Fehlern:
"Fehlt Ihnen eine using-Direktive oder eine Assembly-Referenz?"
NuGet Manager ist 2.7 (ich sehe dies in Visual Studio 2013 über Box). Ich habe sogar versucht, EnableNuGetPackageRestore=true
Parameter zu übergeben - kein Glück. Was vermisse ich?
Antworten:
AKTUALISIERT mit der neuesten offiziellen NuGet-Dokumentation ab Version 3.3.0
Ansätze zur Paketwiederherstellung
quelle
Wenn Sie Visual Studio 2017 oder höher verwenden, das mit MSBuild 15 oder höher geliefert wird
PackageReference
, und Ihre .csproj-Dateien im neuen Format vorliegen , ist die einfachste Methode die Verwendung des neuen MSBuild-Restore
Ziels .Niemand hat tatsächlich die ursprüngliche Frage beantwortet: "Wie kann ich NuGet-Pakete beim Erstellen über die Befehlszeile mit MSBuild automatisch wiederherstellen?" Die Antwort lautet: Wenn Sie nicht die Option "NuGet-Paketwiederherstellung aktivieren" verwenden (die jetzt gemäß dieser Referenz veraltet ist ), können Sie dies nicht (siehe unten). Wenn Sie versuchen, z. B. automatisierte Builds auf einem CI-Server durchzuführen, ist dies zum Kotzen.
Es gibt jedoch einen kleinen Umweg, um das gewünschte Verhalten zu erreichen:
nuget restore
wodurch alle fehlenden Pakete automatisch heruntergeladen werden.msbuild
, um Ihre Lösung zu erstellen.Nebenbei: Während die neue und empfohlene Methode zur automatischen Paketwiederherstellung weniger Unordnung in Ihrer Versionskontrolle mit sich bringt, macht sie auch die Wiederherstellung von Befehlszeilenpaketen unmöglich, es sei denn, Sie springen durch den zusätzlichen Rahmen des Herunterladens und Ausführens
nuget.exe
. Fortschritt?quelle
nuget.exe
in / trunk / ext). Ein Schritt vorwärts - zwei Schritte zurück :(Die automatische Paketwiederherstellung von Nuget ist eine Funktion von Visual Studio (ab 2013), nicht von MSBuild. Sie müssen ausgeführt werden,
nuget.exe restore
wenn Sie Pakete über die Befehlszeile wiederherstellen möchten.Sie können auch die Funktion "Nuget-Paketwiederherstellung aktivieren" verwenden. Dies wird jedoch von den Nuget-Mitarbeitern nicht mehr empfohlen, da dadurch aufdringliche Änderungen an den Projektdateien vorgenommen werden und Probleme auftreten können, wenn Sie diese Projekte in einer anderen Lösung erstellen.
quelle
Ich habe einige Zeit gebraucht, um das ganze Bild herauszufinden, und ich möchte es hier teilen.
Visual Studio bietet zwei Ansätze zur Verwendung der Paketwiederherstellung: Automatische Paketwiederherstellung und MSBuild-integrierte Paketwiederherstellung. Die 'MSBuild-integrierte Paketwiederherstellung' stellt Pakete WÄHREND des Erstellungsprozesses wieder her, die in einigen Szenarien Probleme verursachen können. Die "automatische Paketwiederherstellung" wird vom NuGet-Team empfohlen .
Es gibt mehrere Schritte, damit die automatische Paketwiederherstellung funktioniert:
Aktualisieren Sie in Visual Studio unter Extras -> Erweiterungen und Updates NuGet, wenn es eine neuere Version gibt (Version 2.7 oder höher).
Wenn Sie TFS verwenden, entfernen Sie im Ordner .nuget Ihrer Lösung die Dateien NuGet.exe und NuGet.targes. Bearbeiten Sie dann NuGet.Config, um NuGet-Pakete nicht einzuchecken:
Wenn Sie zuvor den Paketordner der Lösung in TFS eingecheckt haben, löschen Sie den Ordner und aktivieren Sie das Löschen des Paketordners.
Wenn Sie TFS nicht verwenden, löschen Sie den Ordner .nuget.
Entfernen Sie in jeder Projektdatei (.csproj oder .vbproj) in Ihrer Lösung die Zeile, die auf die Datei NuGet.targets verweist. Die Referenz sieht folgendermaßen aus:
Entfernen Sie diese Zeile in jeder Projektdatei in Ihrer Lösung.
Im Visual Studio-Menü entweder durch
Extras -> Optionen -> Paketmanager -> Allgemein oder Extras -> NuGet-Paketmanager -> Paketmanagereinstellungen
Bitte aktivieren Sie die folgenden beiden Optionen: 1) 'NuGet darf fehlende Pakete herunterladen' 2) 'Beim Erstellen in Visual Studio automatisch nach fehlenden Paketen suchen'
Testen Sie die Konfiguration Ihrer Paketwiederherstellung anhand der folgenden Schritte
quelle
MSBuild 15 verfügt über eine / t: Wiederherstellungsoption , die dies ausführt . es kommt mit Visual Studio 2017.
Wenn Sie dies verwenden möchten, müssen Sie auch die neue PackageReference verwenden. Dies bedeutet, dass Sie die
packages.config
Datei durch Elemente wie dieses ersetzen müssen (tun Sie dies in * .csproj):Wenn Sie mit der rechten Maustaste auf "Referenzen" klicken, erfolgt eine automatische Migration in dieses Format (diese wird möglicherweise nicht angezeigt, wenn Sie gerade Visual Studio geöffnet, das Fenster "NuGet-Pakete für Lösung verwalten" neu erstellt oder geöffnet haben und es wird angezeigt).
quelle
Ian Kemp hat die Antwort (habe übrigens einige Punkte), dies ist, einfach etwas Fleisch zu einem seiner Schritte hinzuzufügen.
Der Grund, warum ich hier gelandet bin, war, dass die Maschinen der Entwickler gut gebaut wurden, aber der Build-Server einfach nicht die erforderlichen Pakete herunterzog (leerer Paketordner) und daher der Build fehlschlug. Die Anmeldung am Build-Server und das manuelle Erstellen der Lösung funktionierten jedoch.
Um den zweiten von Ians 3-Punkt-Schritten (Ausführen der Nuget-Wiederherstellung ) auszuführen, können Sie ein MSBuild-Ziel erstellen, auf dem der Befehl exec ausgeführt wird, um den Befehl Nuget-Wiederherstellung wie folgt auszuführen (in diesem Fall befindet sich nuget.exe im Ordner .nuget und nicht auf dem Pfad), der dann in einem TeamCity-Erstellungsschritt (anderes verfügbares CI ...) unmittelbar vor dem Erstellen der Lösung ausgeführt werden kann
Für die Aufzeichnung hatte ich bereits den Runner-Typ "Nuget Installer" ausprobiert, aber dieser Schritt hing an Webprojekten (funktionierte für DLL- und Windows-Projekte).
quelle
Beachten Sie, dass Sie, wenn Sie TeamCity als Build-Server verwenden, einen "NuGet Installer" -Schritt erhalten , mit dem Sie alle Pakete vor dem Build-Schritt wiederherstellen können.
quelle
Es gibt eine packages.configDas Projekt enthält Datei , die die Paketdetails enthält.
Außerdem gibt es einen .nuget-Ordner, der die NuGet.exe- und NuGet.targets enthält . Wenn eine der Dateien fehlt, wird das fehlende Paket nicht wiederhergestellt und die Ursache "Fehlt Ihnen eine using-Direktive oder eine Assembly-Referenz?" Error
quelle
.nuget
Ordner und war es nie. Allepackages.config
Dateien in den Projektordnern sind vorhanden.Manchmal tritt dies auf, wenn sich der Ordner des Pakets, das Sie wiederherstellen möchten , im Ordner "packages" befindet (dh "Packages / EntityFramework.6.0.0 /" ) , die "DLLs" jedoch nicht darin enthalten sind (der größte Teil der Versionskontrolle) Systeme ignorieren automatisch ".dll" -Dateien). Dies liegt daran, dass NuGet vor dem Versuch, jedes Paket wiederherzustellen, prüft, ob die Ordner bereits vorhanden sind. Wenn es also vorhanden ist, geht NuGet davon aus, dass sich die "DLL" darin befindet. Wenn dies das Problem für Sie ist, löschen Sie einfach den Ordner, den NuGet korrekt wiederherstellt.
quelle
Ich hatte ein Problem mit Nuget-Paketen, die nicht in einem nächtlichen Build mit Skript enthalten waren, der die sln-Datei mit devenv.exe erstellt.
Ich folgte den Ratschlägen von Microsoft und der wichtigste Schritt bestand darin, die NuGet-Konfiguration
%AppData%/NuGet
so zu aktualisieren , dass sie Folgendes enthielt:quelle
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 und den Pfad beibehalten.
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)
quelle
Sie können auch verwenden
So stellen Sie die NuGet-Pakete in der Paketverwaltungskonsole in Visual Studio wieder her.
quelle