首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSBuild -一个包引用会干扰加载一个单独的任务

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

Stack Overflow用户
提问于 2021-01-03 19:21:30
回答 1查看 569关注 0票数 0

使用MSBuild,以下内容可以很好地构建和工作:

代码语言:javascript
复制
<PackageReference Include="Publicise.MSBuild.Task" Version="1.3.0"/>

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

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

代码语言:javascript
复制
<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的公共类。

为什么有完全不同的东西阻止任务被正确地找到,我怎样才能解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-04 06:29:17

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

,因为您已经安装了ILRepack.MSBuild.Task nuget包的末尾。而PackageReference节点ILRepack.MSBuild.Task的末端是akways节点。因此,$(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

C:\Users\xxx\.nuget\packages\ilrepack.msbuild.task\2.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开始的,这是因为后面安装的包覆盖了它。

可以理解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文件,

修改如下:

代码语言:javascript
复制
<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按钮而不是重构按钮再次测试。

解决方案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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65553940

复制
相关文章

相似问题

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