2017-08-16 5 views
1

This sample zeigt ein .NET Core-Projekt, das in ein nugget-Paket nur mit dotnet pack verpackt werden kann, und wenn es in einem anderen Projekt wiederhergestellt wird, integriert es in der Msbuild-Pipeline. Eines der großartigen Dinge an diesem Beispiel ist die Erstellung eines nugget-Pakets, das mit msbuild unter Linux, Mac und Windows integriert werden kann. Der benutzerdefinierte Buildcode hat jedoch keine Abhängigkeiten von anderen Assemblys..net Kern Msbuild nugget mit zusätzlichen Baugruppen

Wie kann ich dieses Beispiel anpassen, um Code zu verwenden, der eine Abhängigkeit verwendet?

Hier sind meine Fehlversuche:

Versuch 1

ich ein Paket Verweis auf Newtonsoft.Json hinzugefügt und geändert den Code einige JSON Serialisierung zu tun. Doch in dem Projekt, das den Build nuget verwendet, wenn ich ein dotnet publish tun, ich die folgende Fehlermeldung erhalten:

error MSB4018: The "Zip" task failed unexpectedly. [C:\git\MSBuild-Features-With-Nate-McMaster\Video-2\1-NuGet\Web.csproj] 
error MSB4018: System.IO.FileNotFoundException: Could not load file or assembly 'Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'. The system cannot find the file specified. [C:\git\MSBuild-Features-With-Nate-McMaster\Video-2\1-NuGet\Web.csproj] 

Außerdem, wenn mein Projekt nicht bereits eine Abhängigkeit von JSON.NET und fügte hinzu, die Build hat nugget würde es unnötigerweise hinzufügen.

Versuch 2

I nuget.exe spec eine .nuspec Datei zu erstellen. Am Ende der Datei, fügte ich hinzu:

<files> 
    <file src="bin\Release\**" target="build" /> 
    <file src="build\**" target="build" /> 
</files> 

jedoch beide "dotnet Pack" und "msbuild/t: packen" ignorieren Sie die Datei und nuget.exe pack schlägt mit dem Fehler Unable to find 'bin\Release\0-WriteATask\bin\Release\'. Make sure the project has been built.. Wenn ich nuget.exe pack Zipper.nuspec oder msbuild /t:pack /p:NuspecFiles=Zipper.nuspec versuche, scheitern beide mit der Nachricht Value cannot be null or an empty string..

Versuch 3

bearbeitet ich die nuspec alle der Platzhalter zu entfernen, die normalerweise aus dem Projekt (beliebige Zeichenfolge beginnt und endet mit einem $) berechnet werden. Dann erstellt eine nuget.exe pack Zipper.nuspec eine Nupkg-Datei, und der Ordner net46 enthält Newtsonsoft.Json.dll, aber der Ordner netstandard1.3 nicht.

Antwort

2

Die Art und Weise, wie MSBuild eine Task-Assembly lädt, kann das Laden zusätzlicher Assemblys erschweren, von denen Sie möglicherweise abhängig sind.

Normalerweise ist der einfachste Weg, dies zu lösen, eine Kopie Ihrer Abhängigkeiten in Ihrem NuGet-Paket zu versenden. Aber Ihre Abhängigkeiten neben Ihrer Aufgabe Assembly-Datei im Paket. Es kann einige zusätzliche Komplikationen geben, die die Verwendung von AssemblyLoadContext oder des AppDomain.AssemblyResolve-Ereignisses erfordern.

Sie können dies ohne eine Nuspec-Datei tun, indem Sie MSBuild zwingen, Ihre Assemblies in die lokale Build-Ausgabe zu kopieren und sie dann in Ihr Paket zu kopieren. Set CopyLocalLockFileAssemblies = true, und fügen Sie die Elemente in der _PackageFiles

Hier ist ein Beispiel dafür, wie das zu tun: https://github.com/madskristensen/BundlerMinifier/blob/3333b5c38289a247391966443370ee6f4a29bf26/src/BundlerMinifier/BundlerMinifier.csproj#L35-L47

Hoffentlich wird dies auch in Zukunft angegangen werden, https://github.com/Microsoft/msbuild/issues/1312, und die Aufgabe Montageauflösung verwendet das NuGet Zwischenspeicher.

+0

Nate, danke für das Video und Probe, und jetzt für diese Antwort! Ich entwickelte ein schreckliches msbuild-Skript, das das Projekt packte (ohne Abhängigkeiten), entzippte es, löschte die automatisch generierten Dateien (mit Ausnahme der nuspec), wendete eine XSLT auf die nuspec an, machte eine 'dotnet publish' für jede TFM und tat es dann ein Nuget-Pack in der Nuspec-Datei. Das Beispiel in Mads Code ist viel, viel besser. Danke! – Ziv

0

Probieren Sie es mit der 9.0.1 Version von Newtonsoft.Json, es funktionierte für mich, all diese Dll Load-Probleme ging weg, und es zielt immer noch auf .NET-Standard. Obwohl ich alle Abhängigkeiten neben der Aufgaben-DLL kopiert habe, aber mit der 10.x Version sogar das hat nicht geholfen.

+0

Welche Plattform laufen Sie? Ich habe nur meine Aufgabe unter Windows ausprobiert, aber Newtonsoft.Json in das gleiche Verzeichnis wie meine Assembly gestellt. Wenn ich mir meinen .NET Core SDK-Ordner anschaue, sehe ich, dass v9.0.1 mit der Runtime gebündelt ist. Wenn Sie diese spezifische Version verwenden, lädt sie wahrscheinlich die Kopie der DLL, nicht die, die Sie mit Ihrer Assembly gebündelt haben. Ich benötige mehr nugget-Pakete, um meine Build-Aufgabe abzuschließen, die nicht Teil des .NET Core-Laufzeitpakets sind, also muss ich wirklich testen. – Ziv

+0

Werfen Sie einen Blick auf dieses Repo, wo ich das Problem demonstriere: https://github.com/BalassaMarton/msbuild-tasks –

+0

Ihr Beispiel fehlt die CopyLocalLockFileAssemblies-Eigenschaft, aber auch nachdem ich es hinzugefügt habe, kann msbuild.exe Ihr Beispiel ausführen , aber dotnet schlägt fehl. Nach mehr als 2 Stunden, in denen ich verschiedene Dinge ausprobiert habe, kann ich es nicht zum Laufen bringen, also habe ich einen Fehler auf dem .net cli erstellt. https://github.com/dotnet/cli/issues/7510 – Ziv

Verwandte Themen