wake-up-neo.com

Die automatische Wiederherstellung von NuGet-Paketen funktioniert nicht mit MSBuild

Ich versuche, mit MSBuild 12.0 eine Lösung zu erstellen, in der packages-Inhalt fehlt (außer repositories.config). Ich gehe davon aus, dass alle fehlenden Pakete vor dem Erstellen automatisch wiederhergestellt werden. Dies ist jedoch nicht der Fall. MsBuild meldet jede Menge Fehler: 

msgstr "fehlt eine using - Direktive oder eine Assembly - Referenz?" 

NuGet Manager ist 2.7 (Ich sehe dies in Visual Studio 2013 über das Feld). Ich habe sogar versucht, EnableNuGetPackageRestore=true Parameter zu übergeben - kein Glück. Was vermisse ich?

90
UserControl

AKTUALISIERT mit der neuesten offiziellen NuGet-Dokumentation ab v3.3.0

Ansätze zum Wiederherstellen von Paketen

NuGet bietet drei Ansätze für die Verwendung von package restore .


Automatische Paketwiederherstellung ist das vom NuGet-Team empfohlene Vorgehen bei der Paketwiederherstellung in Visual Studio. Es wurde in NuGet 2.7 eingeführt. Ab NuGet 2.7 wird die Erweiterung von NuGet Visual Studio in die Buildereignisse von Visual Studio integriert und fehlende Pakete wiederhergestellt, wenn ein Build beginnt. Diese Funktion ist standardmäßig aktiviert. Entwickler können dies jedoch auf Wunsch deaktivieren.


So funktioniert das:

  1. Bei der Projekt- oder Lösungserstellung löst Visual Studio ein Ereignis aus, das eine Build beginnt innerhalb der Lösung. 
  2. NuGet reagiert auf dieses Ereignis und sucht nach packages.config-Dateien, die in der Lösung enthalten sind. 
  3. Für jede gefundene packages.config-Datei werden ihre Pakete und .__ aufgelistet. Im Ordner "Paket" der Lösung ist das Kontrollkästchen "Nach" markiert.
  4. Alle fehlenden Pakete werden aus den konfigurierten (und aktivierten) Paketquellen des Benutzers heruntergeladen, wobei die Reihenfolge der Paketquellen zu beachten ist.
  5. Beim Herunterladen von Paketen werden sie in .__ der Lösung entpackt. Paketordner.

Wenn Sie Nuget 2.7+ installiert haben; Es ist wichtig, eine Methode für die Verwaltung der automatischen Paketwiederherstellung in Visual Studio auszuwählen.

Es stehen zwei Methoden zur Verfügung:

  1. (Nuget 2.7 und höher): Visual Studio -> Tools -> Package Manager -> Package Manager-Einstellungen -> Automatische Paketwiederherstellung aktivieren 
  2. (Nuget 2.6 und darunter) Klicken Sie mit der rechten Maustaste auf eine Lösung und klicken Sie auf "Paket aktivieren Für diese Lösung wiederherstellen".


Befehlszeilenpaket wiederherstellen ist erforderlich, wenn eine Lösung über die Befehlszeile erstellt wird; es wurde in frühen Versionen von NuGet, wurde aber in NuGet 2.7 verbessert. 

nuget.exe restore contoso.sln

Das in MSBuild integrierte Paket restore Ansatz ist die ursprüngliche Implementierung von Package Restore und zwar funktioniert in vielen Szenarien weiter, deckt nicht den gesamten Satz von .__ ab. Szenarien, auf die sich die beiden anderen Ansätze beziehen.

33
KMoraz

Wenn Sie Visual Studio 2017 verwenden, das im Lieferumfang von MSBuild 15 enthalten ist, sind und Ihre .csproj-Dateien im Format neue PackageReference. Die einfachste Methode ist verwenden Sie das neue MSBuild Restore-Ziel .


Niemand hat die ursprüngliche Frage beantwortet, nämlich "Wie erhalte ich die automatischen Wiederherstellung von NuGet-Paketen, wenn mit MSBuild von der Befehlszeile aus gebaut wird?" Die Antwort lautet: Wenn Sie nicht die Option "NuGet-Paketwiederherstellung aktivieren" (die jetzt gemäß diese Referenz veraltet ist) verwenden, können Sie dies nicht tun (siehe unten). Wenn Sie versuchen, z. automatisierte Builds auf einem CI-Server, das ist scheiße.

Es gibt jedoch einen etwas runden Weg, um das gewünschte Verhalten zu erhalten:

  1. Laden Sie die neueste NuGet-Programmdatei von https://dist.nuget.org/win-x86-commandline/latest/nuget.exe herunter und platzieren Sie sie irgendwo in Ihrem PATH. (Sie können dies als Pre-Build-Schritt tun.)
  2. Führen Sie nuget restore aus, um alle fehlenden Pakete automatisch herunterzuladen.
  3. Führen Sie msbuild aus, um Ihre Lösung zu erstellen.

Nebenbei: Während die neue und empfohlene Methode für die automatische Wiederherstellung von Paketen weniger Unordnung in Ihrer Versionskontrolle mit sich bringt, ist auch die Wiederherstellung von Befehlszeilenpaketen unmöglich, es sei denn, Sie müssen durch den zusätzlichen Rahmen des Herunterladens und Ausführen von nuget.exe springen. Fortschritt?

219
Ian Kemp

Die automatische Paketwiederherstellung von Nuget ist eine Funktion von Visual Studio (ab 2013), nicht MSBuild. Sie müssennuget.exe restoreausführen, wenn Sie Pakete von der Befehlszeile aus wiederherstellen möchten. 

Sie können auch die Funktion "Nuget-Paketwiederherstellung aktivieren" verwenden, die von den Nuget-Leuten jedoch nicht mehr empfohlen wird, da sie die Projektdateien aufdringlich ändert und Probleme verursachen kann, wenn Sie diese Projekte in einer anderen Lösung erstellen. 

54
Owen Johnson

Ich habe einige Zeit gebraucht, um das ganze Bild herauszufinden, und ich möchte es hier teilen. 

In Visual Studio gibt es zwei Ansätze für die Paketwiederherstellung: Automatische Paketwiederherstellung und MSBuild-Integrated-Paketwiederherstellung. Die 'MSBuild-Integrated Package Restore' stellt Pakete während des Erstellungsprozesses wieder her, die in einigen Szenarien Probleme verursachen können. Die automatische Paketwiederherstellung wird vom NuGet-Team empfohlener Ansatz

Es gibt mehrere Schritte, um die automatische Paketwiederherstellung zum Laufen zu bringen: 

  1. Aktualisieren Sie NuGet in Visual Studio über Extras -> Erweiterungen und Updates, wenn eine neuere Version (Version 2.7 oder höher) vorhanden ist.

  2. Wenn Sie TFS verwenden, entfernen Sie im .nuget-Ordner der Lösung die Dateien NuGet.exe und NuGet.targes. Bearbeiten Sie dann NuGet.Config, um NuGet-Pakete nicht einzuchecken: 

    <configuration>  
      <solution>  
        <add key="disableSourceControlIntegration" value="true" />  
      </solution>  
    </configuration> 
    

    Wenn Sie bereits im Paketordner der Lösung einen TFS-Check durchgeführt haben, löschen Sie den Ordner und aktivieren Sie das Löschen des Paketordners. 

    Wenn Sie kein TFS verwenden, löschen Sie den Ordner .nuget. 

  3. Entfernen Sie in jeder Projektdatei (.csproj oder .vbproj) in Ihrer Projektmappe die Zeile, die auf die Datei NuGet.targets verweist. Die Referenz sieht so aus: 

    <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
    

    Entfernen Sie diese Zeile in jeder Projektdatei in Ihrer Projektmappe. 

  4. Im Visual Studio-Menü entweder durch 

    Extras -> Optionen -> Paket-Manager -> Allgemein oder Werkzeuge -> NuGet Package Manager -> Paket-Manager-Einstellungen

    bitte aktivieren Sie die folgenden beiden Optionen 1) "NuGet das Herunterladen fehlender Pakete zulassen" 2) "Automatisch nach fehlenden Paketen während der Erstellung in Visual Studio suchen"

  5. Testen Sie Ihre Paketwiederherstellungskonfiguration anhand der folgenden Schritte

    • Speichern Sie Ihre Lösung und schließen Sie Visual Studio
    • Löschen Sie den Paketordner Ihrer Lösung
    • Starten Sie Visual Studio, öffnen Sie Ihre Lösung und erstellen Sie sie neu. 
17
Ying

MSBuild 15 verfügt über die Option /t: restore , 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, die packages.config-Datei durch Elemente wie folgt zu ersetzen (tun Sie dies in * .csproj):

<ItemGroup>
  <!-- ... -->
  <PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
  <!-- ... -->
</ItemGroup>

Wenn Sie mit der rechten Maustaste auf "Verweise" klicken, wird eine automatische Migration in dieses Format durchgeführt. Wenn Sie Visual Studio gerade geöffnet, das Fenster "NuGet-Pakete für Lösung verwalten" geöffnet haben, wird es möglicherweise nicht angezeigt.

3
Chris

Ian Kemp hat die Antwort (einige Punkte übrigens ...), dies ist, einfach etwas Fleisch zu einem seiner Schritte hinzuzufügen.

Der Grund, warum ich hier gelandet war, war, dass die Maschinen von dev gut gebaut wurden, aber der Build-Server zog einfach nicht die benötigten Pakete herunter (leerer Paketordner) und daher schlug der Build fehl. Das Anmelden am Build-Server und das manuelle Erstellen der Lösung funktionierten jedoch.

Um den zweiten von Ians 3-Punkt-Schritten (Ausführen von nuget restore ) auszuführen, können Sie ein MSBuild-Ziel erstellen, das den exec-Befehl ausführt, um den Befehl nuget restore auszuführen (siehe unten). In diesem Fall befindet sich nuget.exe im .nuget Ordner (und nicht im Pfad), der dann unmittelbar vor dem Erstellen der Lösung in einem TeamCity-Build-Schritt (anderes CI verfügbar) ausgeführt werden kann

<Target Name="BeforeBuild">
  <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>

Für das Protokoll habe ich bereits den Runner-Typ "nuget installer" ausprobiert, aber dieser Schritt hing an Webprojekten (funktionierte für DLLs und Windows-Projekte).

3

Wenn Sie TeamCity als Build-Server verwenden, erhalten Sie einen Schritt "NuGet Installer", mit dem Sie alle Pakete vor dem Build-Schritt wiederherstellen können.

2
Dejan

Dies tritt manchmal auf, wenn sich der Ordner des Pakets, das Sie wiederherstellen möchten, im Ordner "packages" befindet (dh "Packages/EntityFramework.6.0.0 /"), aber die "DLLs" nicht darin enthalten sind (Die meisten Versionskontrollsysteme ignorieren automatisch ".dll" -Dateien). Dies geschieht, weil NuGet vor dem Versuch, jedes Paket wiederherzustellen, prüft, ob die Ordner bereits vorhanden sind. Wenn also NuGet 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.

2

Das Projekt enthält eine packages.config -Datei, die die Paketdetails enthält.

Es gibt auch einen .nuget-Ordner, der die Dateien NuGet.exe und NuGet.targets enthält. Wenn eine der Dateien fehlt, stellt sie das fehlende Paket nicht wieder her und führt dazu, "fehlt eine using-Direktive oder eine Assembly-Referenz?" Error

2
Sumeshk

Ich hatte ein Problem mit Nuget-Paketen, die nicht in einem nächtlichen Skript-Build enthalten sind, das die SLN-Datei mit devenv.exe erstellt. 

Ich folgte dem Hinweis von Microsoft und der Schlüsselschritt bestand darin, die NuGet-Konfiguration in %AppData%/NuGet so zu aktualisieren, dass sie Folgendes enthielt:

<configuration>
    <packageRestore>
        <add key="automatic" value="True" />
    </packageRestore>
</configuration>
0
PaulG

In Visual Studio 2017 - Beim Kompilieren mit IDE - Es werden alle fehlenden Nuget-Pakete heruntergeladen und im Ordner "Packages" gespeichert.

Die Kompilierung auf der Build-Maschine erfolgte jedoch mit msbuild.exe. 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 restore NAME_OF_SLN_File (wenn es nur eine .SLN-Datei gibt, können Sie diesen Parameter ignorieren)

0
David

Sie können auch verwenden

Update-Package -reinstall

wiederherstellen der NuGet-Pakete in der Package Management Console in Visual Studio.

0
MovGP0