![](/img/trans.png)
[英]MSBuild Inline Task - Reference non-standard Microsoft assemblies
[英]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>
但是,当我添加另一个 Package 参考(没有其他改变)时,它在构建时遇到错误:
<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 的公共 class。
为什么完全独立的东西会阻止正确找到任务,我该如何解决这个问题?
该问题是由这两个 msbuild 任务 nuget 包意外引起的。
并且由于您最后安装了ILRepack.MSBuild.Task
nuget package。 ILRepack.MSBuild.Task
的PackageReference节点在最后。 So $(TaskAssembly)
is always loads from ILRepack.MSBuild.Task
nuget package and the value from publicise.msbuild.task
is being covered. 并且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
C:\Users\xxx\.nuget\packages\ilrepack.msbuild.task\2.0.13\build\ILRepack.MSBuild.Task.props
Also , when you project loads the nuget package, you can check under C:\xxx\source\repos\xxx(project_name)\xxx(project_name)\obj\xxx.csproj.nuget.g.props
:
加载ILRepack.MSBuild.Task.props
总是在最后, $(TaskAssembly)
总是来自ilrepack.msbuild.task
因为被后来安装的 ZEFE90A8E604A7C840E88D03A6 覆盖
可以理解来自ilrepack.msbuild.task
的错误Publicise
task(应该来自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\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
。
然后,保存更改,然后单击Build按钮而不是Rebuild按钮再次测试。
解决方案2)
将ILRepack.MSBuild.Task
nuget package 降级到版本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
:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.