首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自定义msbuild任务尝试以错误的版本加载依赖项。

自定义msbuild任务尝试以错误的版本加载依赖项。
EN

Stack Overflow用户
提问于 2019-10-06 02:46:07
回答 1查看 825关注 0票数 1

我有一个定制的发布过程,它首先通过ILRepack将一些程序集合并成一个程序集,然后执行其他一些步骤,最后清理发布目录--从APP_NAME.deps.json、相关程序集和符号文件中删除合并的依赖项。

为了实现最后一步,我创建了一个带有自定义MsBuild任务的MsBuild包。根据内特的博客文章,我已经设置了PrivateAssets="All",以便在包中发布所有任务的依赖项:

代码语言:javascript
运行
复制
<ItemGroup>
    <PackageReference Include="JetBrains.Annotations" Version="2019.1.3" />
    <PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.9.20" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
    <PackageReference Update="@(PackageReference)" PrivateAssets="All" />        
</ItemGroup>

包布局如下所示:

突然间,在发布期间,此步骤失败时出错:

任务意外失败。无法加载文件或程序集'Newtonsoft.Json,Version=12.0.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed‘。无法找到或加载特定文件。(0x80131621)

我不明白为什么任务尝试加载12.0.0.0版本,而我有Newtonsoft.Json 12.0.2 (如PackageReference中所指定的)。

谢谢你的帮助!

更新:

根据这个msbuild规范,当前MSBuild任务有严重的限制:

MSBuild中的任务是具有潜在分离和冲突依赖树的动态加载程序集。目前,MSBuild on .NET Core在任务之间没有隔离,因此只能加载任何给定程序集的一个版本。这方面的主要例子是Newtonsoft.Json,它有多个版本,但所有任务都必须同意才能工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-07 09:56:14

  1. 正如李乐士在注释中提到的,12.0.2是对应于12.0.0.0程序集版本的NuGet包版本。因此,系统尝试加载程序集的正确版本。
  2. 根据task-isolation-and-dependencies.md相关问题等定制MsBuild任务有严重的局限性。
  3. MsBuild本身包含对Newtonsoft.Json 11.0.1的依赖项,因此自定义任务不能加载该依赖项的任何其他版本。

解决办法:

  1. 使用与MsBuild相同的依赖版本。我想这种方法是脆弱的,不应该使用。
  2. 创建并打包控制台应用程序,而不是自定义MsBuild任务。我之所以选择这种方法,是因为它易于扩展,并且允许我们使用任何依赖版本。内特的博客文章概述了该方法。
  3. 正如马丁·乌利希在注释中提到的,我们可以使用带有隔离边界的任务。ContextAwareTask.cs演示了该方法。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58253863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档