dotnet restore gegen nuget restore mit teamcity

9

Ich habe ein asp.net-Kernprojekt, das ordnungsgemäß mit VS erstellt, aber nicht unter msbuild erstellt wird.

Es findet nicht alle gängigen Bibliotheken (System usw.)

Ich benutze teamcity und ein Teil des Build-Prozesses ist eine Nuget-Wiederherstellung.

Ich habe versucht, die gleichen Schritte wie teamcity zu machen, aber manuell mit msbuild, und es ist fehlgeschlagen, die libs nicht gefunden.

Ich habe einen Dotnet-Wiederherstellungsschritt hinzugefügt und dann hat es funktioniert.

Was ist also der Unterschied zwischen einer nuget-Wiederherstellung und einer dotnet-Wiederherstellung ?

    
Thomas 26.08.2017, 16:02
quelle

3 Antworten

16

Sowohl nuget restore als auch dotnet restore sind ungefähr gleich: Sie führen eine Nuget-Wiederherstellung aus.

Der einzige Unterschied: dotnet restore ist ein Convenience-Wrapper zum Aufrufen von dotnet msbuild /t:Restore , der eine Msbuild-integrierte Wiederherstellung aufruft. Dies funktioniert nur bei msbuild-Distributionen, die NuGet enthalten, wie VS 2017 (vollständige VS, Build-Tools) oder Mono 5.2+ (= & gt; msbuild /t:Restore ) und dem .NET Core Sdk, der diesen Komfortbefehl bereitstellt.

Im Moment gibt es zwei Möglichkeiten, wie NuGet-Pakete in Projekten verwendet werden können (3 tatsächlich, aber lassen Sie uns project.json auf UWP im Moment ignorieren):

  • packages.config : Die "klassische" Art, auf NuGet-Pakete zu verweisen. Dies setzt voraus, dass NuGet ein separates Tool ist und msbuild nichts über NuGet weiß. Ein NuGet-Client wie nuget.exe oder VS-integrated tooling sieht die Datei packages.config und lädt die referenzierten Pakete bei der Wiederherstellung in einen lokalen Ordner. Bei einer Paketinstallation wird das Projekt so geändert, dass Objekte aus diesem lokalen Ordner referenziert werden. Eine Wiederherstellung für ein packages.config -Projekt lädt nur die Dateien herunter.
  • PackageReference : Das Projekt enthält MSBuild-Elemente, die auf ein NuGet-Paket verweisen. Im Gegensatz zu packages.config werden nur die direkten Abhängigkeiten aufgelistet und die Projektdatei verweist nicht direkt auf Assets (DLL-Dateien, Inhaltsdateien) aus Paketen. Bei der Wiederherstellung ermittelt NuGet das Abhängigkeitsdiagramm durch Auswertung der direkten und transitiven Abhängigkeiten, stellt sicher, dass alle Pakete in den globalen Paketcache des Benutzers heruntergeladen werden (nicht lösungslokal, so dass es nur einmal heruntergeladen wird) und schreibt eine Inhaltsdatei in die obj Ordner, der eine Liste aller Pakete und Assets enthält, die das Projekt verwendet, sowie zusätzliche msbuild-Ziele, wenn ein Paket Build-Logik enthält, die einem Projekt hinzugefügt werden muss. Daher kann eine Nuget-Wiederherstellung Pakete herunterladen, wenn sie nicht bereits im globalen Cache vorhanden sind, und diese Assets-Datei erstellen. Zusätzlich zu den Paketverweisen kann das Projekt auch auf CLI-Tools verweisen, bei denen es sich um NuGet-Pakete handelt, die zusätzliche Befehle enthalten, die für das Verzeichnis dotnet im Projektverzeichnis verfügbar sind.

Die msbuild-integrierte Wiederherstellung funktioniert nur für PackageReference type-Projekte (.NET Standard, .NET Core ist standardmäßig, aber für jedes .NET-Projekt aktiviert) und nicht für packages.config Projekte. Wenn Sie eine neue Version von nuget.exe (z. B. 4.3.0) verwenden, können beide Projekttypen wiederhergestellt werden.

Ihr Fehler über fehlende Typen ist etwas interessanter: Die "Referenz-Assemblies" (Bibliotheken, die als Eingabe an den Compiler übergeben werden) sind nicht auf dem System installiert, sondern kommen über NuGet-Pakete. Solange die NuGet-Pakete nicht im globalen Paket-Cache vorhanden sind oder die obj/project.assets.json -Datei nicht durch eine Wiederherstellungsoperation generiert wurde, sind grundlegende Typen wie System.Object für den Compiler nicht verfügbar.

    
Martin Ullrich 26.08.2017, 21:53
quelle
0

Ich hatte ähnliche Probleme mit einem .net-Core-2-Projekt, das auf meiner Workstation - sowohl in Visual Studio 2017 als auch in Msbuild - einwandfrei funktionierte, aber nicht in TeamCity. Die Fehlermeldung war:

%Vor%

In meiner Build-Konfiguration hatte ich bereits vor dem Build-Schritt einen NuGet Install-Schritt:

  • NuGetversion: 3.4.4
  • Wiederherstellungsmodus: Installieren

Es stellte sich heraus, dass ich Folgendes verwenden musste:

  • NuGet-Version: 4.0.0 oder höher
  • Wiederherstellungsmodus: Wiederherstellen (benötigt NuGet 2.7 +)
hsop 09.03.2018 12:26
quelle
-1
___ answer45899966 ___

Sowohl %code% als auch %code% sind ungefähr gleich: Sie führen eine Nuget-Wiederherstellung aus.

Der einzige Unterschied: %code% ist ein Convenience-Wrapper zum Aufrufen von %code% , der eine Msbuild-integrierte Wiederherstellung aufruft. Dies funktioniert nur bei msbuild-Distributionen, die NuGet enthalten, wie VS 2017 (vollständige VS, Build-Tools) oder Mono 5.2+ (= & gt; %code% ) und dem .NET Core Sdk, der diesen Komfortbefehl bereitstellt.

Im Moment gibt es zwei Möglichkeiten, wie NuGet-Pakete in Projekten verwendet werden können (3 tatsächlich, aber lassen Sie uns %code% auf UWP im Moment ignorieren):

  • %code% : Die "klassische" Art, auf NuGet-Pakete zu verweisen. Dies setzt voraus, dass NuGet ein separates Tool ist und msbuild nichts über NuGet weiß. Ein NuGet-Client wie %code% oder VS-integrated tooling sieht die Datei %code% und lädt die referenzierten Pakete bei der Wiederherstellung in einen lokalen Ordner. Bei einer Paketinstallation wird das Projekt so geändert, dass Objekte aus diesem lokalen Ordner referenziert werden. Eine Wiederherstellung für ein %code% -Projekt lädt nur die Dateien herunter.
  • %code% : Das Projekt enthält MSBuild-Elemente, die auf ein NuGet-Paket verweisen. Im Gegensatz zu %code% werden nur die direkten Abhängigkeiten aufgelistet und die Projektdatei verweist nicht direkt auf Assets (DLL-Dateien, Inhaltsdateien) aus Paketen. Bei der Wiederherstellung ermittelt NuGet das Abhängigkeitsdiagramm durch Auswertung der direkten und transitiven Abhängigkeiten, stellt sicher, dass alle Pakete in den globalen Paketcache des Benutzers heruntergeladen werden (nicht lösungslokal, so dass es nur einmal heruntergeladen wird) und schreibt eine Inhaltsdatei in die %code% Ordner, der eine Liste aller Pakete und Assets enthält, die das Projekt verwendet, sowie zusätzliche msbuild-Ziele, wenn ein Paket Build-Logik enthält, die einem Projekt hinzugefügt werden muss. Daher kann eine Nuget-Wiederherstellung Pakete herunterladen, wenn sie nicht bereits im globalen Cache vorhanden sind, und diese Assets-Datei erstellen. Zusätzlich zu den Paketverweisen kann das Projekt auch auf CLI-Tools verweisen, bei denen es sich um NuGet-Pakete handelt, die zusätzliche Befehle enthalten, die für das Verzeichnis %code% im Projektverzeichnis verfügbar sind.

Die msbuild-integrierte Wiederherstellung funktioniert nur für %code% type-Projekte (.NET Standard, .NET Core ist standardmäßig, aber für jedes .NET-Projekt aktiviert) und nicht für %code% Projekte. Wenn Sie eine neue Version von %code% (z. B. 4.3.0) verwenden, können beide Projekttypen wiederhergestellt werden.

Ihr Fehler über fehlende Typen ist etwas interessanter: Die "Referenz-Assemblies" (Bibliotheken, die als Eingabe an den Compiler übergeben werden) sind nicht auf dem System installiert, sondern kommen über NuGet-Pakete. Solange die NuGet-Pakete nicht im globalen Paket-Cache vorhanden sind oder die %code% -Datei nicht durch eine Wiederherstellungsoperation generiert wurde, sind grundlegende Typen wie %code% für den Compiler nicht verfügbar.

    
___ qstnhdr ___ dotnet restore gegen nuget restore mit teamcity ___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___ tag123msbuild ___ Die Microsoft Build Engine, auch bekannt als MSBuild, ist eine Build-Plattform für verwalteten Code und war Teil von .NET Framework. ___ tag123nuget ___ NuGet ist ein kostenloses, auf Open Source-Entwickler ausgerichtetes Paketverwaltungssystem für die .NET-Plattform. ___ answer49193810 ___

Ich hatte ähnliche Probleme mit einem .net-Core-2-Projekt, das auf meiner Workstation - sowohl in Visual Studio 2017 als auch in Msbuild - einwandfrei funktionierte, aber nicht in TeamCity. Die Fehlermeldung war:

%Vor%

In meiner Build-Konfiguration hatte ich bereits vor dem Build-Schritt einen NuGet Install-Schritt:

  • NuGetversion: 3.4.4
  • Wiederherstellungsmodus: Installieren

Es stellte sich heraus, dass ich Folgendes verwenden musste:

  • NuGet-Version: 4.0.0 oder höher
  • Wiederherstellungsmodus: Wiederherstellen (benötigt NuGet 2.7 +)
___ tag123teamcity ___ TeamCity ist ein von JetBrains entwickelter Server für kontinuierliche Integration und kontinuierliche Bereitstellung. Es bietet sofort einsatzbereite Komponententests, Analyse der Codequalität und frühzeitige Berichterstellung zu Build-Problemen. TeamCity unterstützt die Java-, .NET- und Ruby-Entwicklung und integriert sich perfekt in die wichtigsten IDEs, Versionskontrollsysteme und Problemverfolgungssysteme. ___ qstntxt ___

Ich habe ein asp.net-Kernprojekt, das ordnungsgemäß mit VS erstellt, aber nicht unter msbuild erstellt wird.

Es findet nicht alle gängigen Bibliotheken (System usw.)

Ich benutze teamcity und ein Teil des Build-Prozesses ist eine Nuget-Wiederherstellung.

Ich habe versucht, die gleichen Schritte wie teamcity zu machen, aber manuell mit msbuild, und es ist fehlgeschlagen, die libs nicht gefunden.

Ich habe einen Dotnet-Wiederherstellungsschritt hinzugefügt und dann hat es funktioniert.

Was ist also der Unterschied zwischen einer nuget-Wiederherstellung und einer dotnet-Wiederherstellung ?

    
___
Exonto 26.08.2017 16:13
quelle

Tags und Links