MSBuild - 一个包引用干扰加载单独的任务
MSBuild - one Package Reference interferes with loading a separate Task
使用 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。确认声明正确,程序集及其所有依赖项可用,并且任务包含实现 Microsoft.Build.Framework.ITask.
的 public class
为什么完全独立的东西阻止了正确找到任务,我该如何解决这个问题?
问题是由这两个 msbuild 任务 nuget 包意外引起的。
And 因为你最后安装了 ILRepack.MSBuild.Task
nuget 包。 ILRepack.MSBuild.Task
的 PackageReference 节点在最后。所以 $(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.3.0\build\Publicise.MSBuild.Task.props
C:\Users\xxx\.nuget\packages\ilrepack.msbuild.task.0.13\build\ILRepack.MSBuild.Task.props
还有,当你工程加载nuget包时,可以在C:\xxx\source\repos\xxx(project_name)\xxx(project_name)\obj\xxx.csproj.nuget.g.props
:
下查看
加载ILRepack.MSBuild.Task.props
总是在最后,$(TaskAssembly)
总是来自ilrepack.msbuild.task
,因为被后来安装的包覆盖了。
可以理解 ilrepack.msbuild.task
的错误 Publicise
任务(应该来自 publicise.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.0.13\build\ILRepack.MSBuild.Task.props" Condition="Exists('$(NuGetPackageRoot)ilrepack.msbuild.task.0.13\build\ILRepack.MSBuild.Task.props')" />
<Import Project="$(NuGetPackageRoot)publicise.msbuild.task.3.0\build\Publicise.MSBuild.Task.props" Condition="Exists('$(NuGetPackageRoot)publicise.msbuild.task.3.0\build\Publicise.MSBuild.Task.props')" />
</ImportGroup>
在底部制作Publicise.MSBuild.Task.props
。
然后,保存更改,然后单击 Build 按钮而不是 Rebuild 按钮再次测试。
解2)
将 ILRepack.MSBuild.Task
nuget 包降级到版本 2.0.0
。
=================================
更新 1
感谢您分享您对解决方法的看法。由于这两个nuget包必须在你的项目中使用,所以这两个解决方案可能不是很有用。
错误,冲突是由 nuget 包的作者造成的,顺便说一下,您同时使用了这两个 nuget 包中的相同 TaskAssembly
属性。
TreatAsLocalProperty="TaskAssembly"
不会解决问题。 <packages_id>.props
来自 nuget 包的文件仍然嵌入在项目的 CSPROj 文件中。字段是否与TaskAssembly相同或会冲突
更好的解决办法是将TaskAssembly
的nuget包中的一个重命名为另一个,这样不会引起冲突。
1) 打开 C:\Users\xxx\.nuget\packages\ilrepack.msbuild.task.0.13\build\ILRepack.MSBuild.Task.props
文件:
将 TaskAssembly
属性 更改为 TaskAssembly_copy
:
使用 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。确认声明正确,程序集及其所有依赖项可用,并且任务包含实现 Microsoft.Build.Framework.ITask.
的 public class为什么完全独立的东西阻止了正确找到任务,我该如何解决这个问题?
问题是由这两个 msbuild 任务 nuget 包意外引起的。
And 因为你最后安装了 ILRepack.MSBuild.Task
nuget 包。 ILRepack.MSBuild.Task
的 PackageReference 节点在最后。所以 $(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.3.0\build\Publicise.MSBuild.Task.props
C:\Users\xxx\.nuget\packages\ilrepack.msbuild.task.0.13\build\ILRepack.MSBuild.Task.props
还有,当你工程加载nuget包时,可以在C:\xxx\source\repos\xxx(project_name)\xxx(project_name)\obj\xxx.csproj.nuget.g.props
:
加载ILRepack.MSBuild.Task.props
总是在最后,$(TaskAssembly)
总是来自ilrepack.msbuild.task
,因为被后来安装的包覆盖了。
可以理解 ilrepack.msbuild.task
的错误 Publicise
任务(应该来自 publicise.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.0.13\build\ILRepack.MSBuild.Task.props" Condition="Exists('$(NuGetPackageRoot)ilrepack.msbuild.task.0.13\build\ILRepack.MSBuild.Task.props')" />
<Import Project="$(NuGetPackageRoot)publicise.msbuild.task.3.0\build\Publicise.MSBuild.Task.props" Condition="Exists('$(NuGetPackageRoot)publicise.msbuild.task.3.0\build\Publicise.MSBuild.Task.props')" />
</ImportGroup>
在底部制作Publicise.MSBuild.Task.props
。
然后,保存更改,然后单击 Build 按钮而不是 Rebuild 按钮再次测试。
解2)
将 ILRepack.MSBuild.Task
nuget 包降级到版本 2.0.0
。
=================================
更新 1
感谢您分享您对解决方法的看法。由于这两个nuget包必须在你的项目中使用,所以这两个解决方案可能不是很有用。
错误,冲突是由 nuget 包的作者造成的,顺便说一下,您同时使用了这两个 nuget 包中的相同 TaskAssembly
属性。
TreatAsLocalProperty="TaskAssembly"
不会解决问题。 <packages_id>.props
来自 nuget 包的文件仍然嵌入在项目的 CSPROj 文件中。字段是否与TaskAssembly相同或会冲突
更好的解决办法是将TaskAssembly
的nuget包中的一个重命名为另一个,这样不会引起冲突。
1) 打开 C:\Users\xxx\.nuget\packages\ilrepack.msbuild.task.0.13\build\ILRepack.MSBuild.Task.props
文件:
将 TaskAssembly
属性 更改为 TaskAssembly_copy
: