【问题标题】:.net core msbuild nuget with additional assemblies.net core msbuild nuget 和附加程序集
【发布时间】:2017-08-16 05:13:41
【问题描述】:

This sample 展示了一个 .NET Core 项目,只需使用 dotnet pack 即可将其打包成 nuget 包,当在另一个项目中恢复时,它会集成到 msbuild 管道中。这个示例的一大优点是它创建了一个在 linux、mac 和 Windows 上与 msbuild 集成的 nuget 包。但是,自定义构建代码不依赖于任何其他程序集。

如何调整此示例以使用使用依赖项的代码?

这是我失败的尝试:

尝试 1

我添加了对 Newtonsoft.Json 的包引用并更改了代码以进行一些 JSON 序列化。但是,在使用 build 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 pack”和“msbuild /t:pack”都会忽略该文件,并且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 .net-core


    【解决方案1】:

    MSBuild 加载任务程序集的方式会使加载您可能依赖的其他程序集变得很棘手。

    通常,解决此问题的最简单方法是在 NuGet 包中提供依赖项的副本。但是您的依赖项以及包中的任务程序集文件。可能有一些额外的复杂情况需要您使用 AssemblyLoadContext 或 AppDomain.AssemblyResolve 事件。

    您可以在没有 nuspec 文件的情况下执行此操作,方法是强制 MSBuild 将您的程序集复制到本地构建输出中,然后将它们复制到您的包中。设置 CopyLocalLockFileAssemblies=true,并将项目添加到 _PackageFiles

    这是一个如何做到这一点的示例:https://github.com/madskristensen/BundlerMinifier/blob/3333b5c38289a247391966443370ee6f4a29bf26/src/BundlerMinifier/BundlerMinifier.csproj#L35-L47

    希望这将在未来得到解决,https://github.com/Microsoft/msbuild/issues/1312,并且任务程序集解析将使用 NuGet 缓存。

    【讨论】:

    • Nate,感谢您提供视频和示例,现在为您解答!我开发了一个可怕的 msbuild 脚本来打包项目(没有依赖项),解压缩它,删除自动生成的文件(除了 nuspec),将 XSLT 应用于 nuspec,为每个 TFM 执行dotnet publish,然后执行nuspec 文件上的 nuget 包。 Mads 代码中的示例要好得多。谢谢!
    【解决方案2】:

    尝试使用Newtonsoft.Json9.0.1 版本,它对我有用,所有这些 dll 加载问题都消失了,它仍然针对 .NET Standard。虽然我确实复制了任务 dll 旁边的所有依赖项,但是对于 10.x 版本,即使这样也没有帮助。

    【讨论】:

    • 你在运行什么平台?我只在 Windows 上尝试过我的任务,但将 Newtonsoft.Json 放在与我的程序集相同的目录中对我有用。查看我的 .NET Core SDK 文件夹,我发现 v9.0.1 与运行时捆绑在一起,因此通过使用该特定版本,它可能会加载运行时的 dll 副本,而不是与程序集捆绑的那个。我将需要更多的 nuget 包来完成我的构建任务,它们不属于 .NET Core 运行时包,所以我真的需要测试。
    • 看看这个我演示问题的仓库:github.com/BalassaMarton/msbuild-tasks
    • 您的示例缺少 CopyLocalLockFileAssemblies 属性,但即使在我添加它之后,msbuild.exe 也可以运行您的示例,但 dotnet 失败。经过 2 个多小时的尝试不同的事情,我无法让它工作,所以我在 .net cli 上创建了一个错误。 github.com/dotnet/cli/issues/7510
    • 我不知道为什么它被注释掉了,以及在打包之前复制依赖项的部分,但即使我把它们放回去,dotnet build 也会失败。
    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2022-07-09
    相关资源
    最近更新 更多