.net core msbuild nuget附加程序集
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.nuspec
或msbuild /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文件夹不包含。
MSBuild加载任务程序集的方式可能会使加载其他程序集变得非常棘手。
通常情况下,解决这个问题的最简单方法是在你的NuGet包中发布一个你的依赖关系的副本。但是您的依赖关系与您包中的任务程序集文件一起。可能会有一些其他复杂性需要您使用AssemblyLoadContext或AppDomain.AssemblyResolve事件。
您可以通过强制MSBuild将您的程序集复制到本地生成输出中,然后将它们复制到您的程序包中而不使用nuspec文件来执行此操作。设置CopyLocalLockFileAssemblies = TRUE,并添加项目_PackageFiles
希望这将在今后得到解决,https://github.com/Microsoft/msbuild/issues/1312,任务大会决议将使用的NuGet缓存。
试一试的9.0.1
版本,它对我很有用,所有这些dll负载问题都消失了,它仍然以.NET Standard为目标。虽然我确实复制了任务dll旁边的所有依赖项,但使用10.x
版本甚至没有帮助。
你在运行什么平台?我只在Windows上尝试过我的任务,但将Newtonsoft.Json放在与我的程序集一起工作的目录中。看看我的.NET Core SDK文件夹,我发现v9.0.1与运行时捆绑在一起,所以通过使用该特定版本,它可能会加载dll的运行时副本,而不是与程序集捆绑在一起的那个。我将需要更多的nuget包来完成我的构建任务,这些任务不是.NET Core运行时捆绑包的一部分,所以我真的需要测试。 – Ziv
看看这个回购问题,我演示了这个问题: https://github.com/BalassaMarton/msbuild-tasks –
您的示例缺少CopyLocalLockFileAssemblies属性,但即使添加它,msbuild.exe也可以运行您的示例,但dotnet失败。经过两个多小时尝试不同的事情,我无法实现它,所以我在.net cli上创建了一个bug。 https://github.com/dotnet/cli/issues/7510 – Ziv
Nate,谢谢你的视频和示例,现在为这个答案!我开发了一个可怕的msbuild脚本,它打包了项目(没有依赖项),解压缩它,删除自动生成的文件(nuspec除外),将XSLT应用于nuspec,为每个TFM做了一个'dotnet publish',然后做了nuspec文件上的nuget包。 Mads的代码中的例子要好得多。谢谢! – Ziv