.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.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文件夹不包含。

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

试一试的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