2017-08-16 63 views
1

This sample顯示了一個.NET Core項目,它可以使用dotnet pack打包成nuget包,當在另一個項目中恢復時,它將集成到msbuild管道中。這個示例的好處之一是創建了一個nuget包,它與Linux,Mac和Windows上的msbuild集成。但是,自定義構建代碼不具有任何其他程序集的依賴關係。.net core msbuild nuget附加程序集

我該如何調整此示例以使用使用依賴關係的代碼?

這裏是我的失敗嘗試:

嘗試1

我加入Newtonsoft.Json一攬子參考,並改變了代碼做一些JSON序列化。然而,在使用生成的NuGet,當我做了dotnet publish,我得到以下錯誤的項目:

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] 

另外,如果我的項目尚未有JSON.NET的依賴,增加了建設nuget會不必要地添加它。

嘗試2

我用nuget.exe spec創建.nuspec文件。在文件的最後,我說:

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

然而,無論是「DOTNET包」和「的MSBuild /噸:包」忽略該文件,並nuget.exe pack失敗,出現錯誤Unable to find 'bin\Release\0-WriteATask\bin\Release\'. Make sure the project has been built.

如果我嘗試nuget.exe pack Zipper.nuspecmsbuild /t:pack /p:NuspecFiles=Zipper.nuspec,它們都會失敗並顯示消息Value cannot be null or an empty string.

嘗試3

我編輯的nuspec刪除所有那些通常從項目計算(任何字符串開始和以$結尾)的佔位符。然後,做一個nuget.exe pack Zipper.nuspec創建一個nupkg文件,並且net46文件夾包含Newtsonsoft.Json.dll,但netstandard1.3文件夾不包含。

回答

2

MSBuild加載任務程序集的方式可能會使加載其他程序集變得非常棘手。

通常情況下,解決這個問題的最簡單方法是在你的NuGet包中發佈一個你的依賴關係的副本。但是您的依賴關係與您包中的任務程序集文件一起。可能會有一些其他複雜性需要您使用AssemblyLoadContext或AppDomain.AssemblyResolve事件。

您可以通過強制MSBuild將您的程序集複製到本地生成輸出中,然後將它們複製到您的程序包中而不使用nuspec文件來執行此操作。設置CopyLocalLockFileAssemblies = TRUE,並添加項目_PackageFiles

下面是如何做到這一點的例子:https://github.com/madskristensen/BundlerMinifier/blob/3333b5c38289a247391966443370ee6f4a29bf26/src/BundlerMinifier/BundlerMinifier.csproj#L35-L47

希望這將在今後得到解決,https://github.com/Microsoft/msbuild/issues/1312,任務大會決議將使用的NuGet緩存。

+0

Nate,謝謝你的視頻和示例,現在爲這個答案!我開發了一個可怕的msbuild腳本,它打包了項目(沒有依賴項),解壓縮它,刪除自動生成的文件(nuspec除外),將XSLT應用於nuspec,爲每個TFM做了一個'dotnet publish',然後做了nuspec文件上的nuget包。 Mads的代碼中的例子要好得多。謝謝! – Ziv

0

試一試的9.0.1版本,它對我很有用,所有這些dll負載問題都消失了,它仍然以.NET Standard爲目標。雖然我確實複製了任務dll旁邊的所有依賴項,但使用10.x版本甚至沒有幫助。

+0

你在運行什麼平臺?我只在Windows上嘗試過我的任務,但將Newtonsoft.Json放在與我的程序集一起工作的目錄中。看看我的.NET Core SDK文件夾,我發現v9.0.1與運行時捆綁在一起,所以通過使用該特定版本,它可能會加載dll的運行時副本,而不是與程序集捆綁在一起的那個。我將需要更多的nuget包來完成我的構建任務,這些任務不是.NET Core運行時捆綁包的一部分,所以我真的需要測試。 – Ziv

+0

看看這個回購問題,我演示了這個問題: https://github.com/BalassaMarton/msbuild-tasks –

+0

您的示例缺少CopyLocalLockFileAssemblies屬性,但即使添加它,msbuild.exe也可以運行您的示例,但dotnet失敗。經過兩個多小時嘗試不同的事情,我無法實現它,所以我在.net cli上創建了一個bug。 https://github.com/dotnet/cli/issues/7510 – Ziv