MSBuild - 一个包引用干扰加载单独的任务

问题描述

使用 MSBuild,以下构建和工作正常:

<packagereference Include="Publicise.MSBuild.Task" Version="1.3.0"/>

<Target Name="Publicise" BeforeTargets="BeforeBuild">
  <Publicise
    AssemblyPath="..."
    OutputPath="../"/>
</Target>

但是,当我添加一个包引用(不更改其他任何内容)时,它在构建时遇到错误

<packagereference Include="Publicise.MSBuild.Task" Version="1.3.0"/>
<packagereference Include="ILRepack.MSBuild.Task" Version="2.0.13"/>

这会导致错误 MSB4062:

无法从程序集...\ILRepack.MSBuild.Task.dll 加载“Publicise”任务。确认声明正确,程序集及其所有依赖项都可用,并且任务包含实现 Microsoft.Build.Framework.ITask 的公共类。

为什么完全独立的东西会阻止正确找到任务,我该如何解决这个问题?

解决方法

问题是由这两个 msbuild 任务 nuget 包意外引起的。

并且因为您最后安装了 ILRepack.MSBuild.Task nuget 软件包。而 ILRepack.MSBuild.TaskPackageReference 节点在最后。所以 $(TaskAssembly) 总是从 ILRepack.MSBuild.Task nuget 包加载,并且 publicise.msbuild.task 的值被覆盖。而问题 The "Publicise" task could not be loaded from the assembly ILRepack.MSBuild.Task.dll 是有道理的。

C:\Users\xxx\.nuget\packages\publicise.msbuild.task\1.3.0\build\Publicise.MSBuild.Task.props

enter image description here

C:\Users\xxx\.nuget\packages\ilrepack.msbuild.task\2.0.13\build\ILRepack.MSBuild.Task.props

enter image description here

另外,当你项目加载nuget包时,你可以在C:\xxx\source\repos\xxx(project_name)\xxx(project_name)\obj\xxx.csproj.nuget.g.props下查看:

enter image description here

加载 ILRepack.MSBuild.Task.props 总是在最后,而 $(TaskAssembly) 总是来自 ilrepack.msbuild.task,因为被后来安装的包覆盖。

可以理解来自 Publicise 的错误 publicise.msbuild.task 任务(应该来自 ilrepack.msbuild.task)。

解决方案

所以你应该在最后加上 publicise.msbuild.task

解决方案 1)

打开C:\xxx\source\repos\xxx(project_name)\xxx(project_name)\obj\xxx.csproj.nuget.g.props文件,

像这样修改:

<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
   
 <Import Project="$(NuGetPackageRoot)ilrepack.msbuild.task\2.0.13\build\ILRepack.MSBuild.Task.props" Condition="Exists('$(NuGetPackageRoot)ilrepack.msbuild.task\2.0.13\build\ILRepack.MSBuild.Task.props')" />

 <Import Project="$(NuGetPackageRoot)publicise.msbuild.task\1.3.0\build\Publicise.MSBuild.Task.props" Condition="Exists('$(NuGetPackageRoot)publicise.msbuild.task\1.3.0\build\Publicise.MSBuild.Task.props')" />
</ImportGroup>

在底部制作Publicise.MSBuild.Task.props

然后,保存更改,然后点击构建按钮而不是重建按钮再次测试。

解决方案 2)

ILRepack.MSBuild.Task nuget 软件包降级到版本 2.0.0

================================

更新 1

感谢您分享您对解决方法的看法。由于这两个nuget包必须在你的项目中使用,所以这两个解决方案可能不是很有用。

错误、冲突是由 nuget 包的作者引起的,顺便说一句,您同时使用了这两个 nuget 包的相同 TaskAssembly 属性。

TreatAsLocalProperty="TaskAssembly" 不会解决问题。来自 nuget 包的 <packages_id>.props 文件仍嵌入在项目的 CSPROj 文件中。字段是否与 TaskAssembly 相同或会发生冲突。

更好的解决方案是您应该将 nuget 包的 TaskAssembly 之一重命名为另一个,这不会引起冲突。

1) 打开 C:\Users\xxx\.nuget\packages\ilrepack.msbuild.task\2.0.13\build\ILRepack.MSBuild.Task.props 文件:

TaskAssembly 属性更改为另一个类似 TaskAssembly_copy

enter image description here