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 ?
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.
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:
Es stellte sich heraus, dass ich Folgendes verwenden musste:
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):
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.
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:
Es stellte sich heraus, dass ich Folgendes verwenden musste:
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 ?