如何忽略NuGet NU1605错误?

6
我有一个包含多个项目和内部NuGet包的庞大解决方案,广泛依赖于Unity 4.0.1。 我们正在评估将此解决方案迁移到Unity 5.11.1以提高性能并解决源自Unity项目在5.0.0版本中已删除的代码的随机DI相关崩溃。

在寻找从外部到内部缓解迁移的方法时,开发了两个工具:

  • 基于Roslyn的源代码转换器
  • 一种实现Unity 5接口的桥梁,但实际上透明地将调用映射到包装的Unity 4容器接口

这两个工具都通过了单元测试,转换器成功转换了一个关键的“叶子”项目,但是,在尝试从一个内部项目引用迁移后的叶子项目时,我们遇到了一个难题:臭名昭著的NU1605

我完全可以理解NU106错误是合理的,因为内部项目仍然引用Unity 4.0.1,而叶子项目引用Unity 5.11.1。 然而,这是工具阻碍我们的一种情况:我需要两个版本“共存”,因为我正在手动处理它们之间的不一致性。

从理论上来说,这应该是可行的,因为DLL文件有不同的版本,甚至名称空间也不同。

有没有什么方法可以“强制”NuGet接受这种奇怪的设置呢?


你将引用的这两个包中的程序集名称是否相同?我的意思是文件名。NuGet 包通常包含不包含版本号的程序集,这是非常典型的情况,这意味着您编译的输出文件夹不能包含两个不同版本的文件,因为它们将具有相同的文件名。如果我们完全忽略 NuGet 的警告,你确定你所要求的事情甚至在任何情况下都是可能的吗? - Lasse V. Karlsen
我还没有检查实际的Unity DLL文件名,但是我有一个设置单元测试引用Unity 4.0.1,并且主项目引用Unity 5.11.1作为NuGet软件包。所有测试都通过了,但编译会发出NU1605警告,因此我怀疑程序集标识不同,这使得CLR能够单独加载每个版本。 - Machinarius
1个回答

13
你有两个选项来禁止那段代码。一个是使用<NoWarn>NU1605</NoWarn> msbuild属性(必须在PropertyGroup内定义)。Visual Studio的项目属性可能有一种在UI中编辑它的方法。
另一个选项是将NoWarn="NU1605"元数据添加到你的PackageReference项中。
<PackageReference Include="package id" Version="1.2.3" NoWarn="NU1605" />

最后,NuGet实际上将NU1605报告为警告,如果你仔细阅读文档页面标题的话,你可能会注意到。.NET Core SDK使用WarningsAsErrors属性将其提升为错误。因此,如果你对MSBuild非常熟悉,你可以在添加它之后将其移除,或者查看如何防止它被添加到列表中。我猜测这样做的动机是因为BCL正在作为.NET Core 1.x和2.x的包进行分发(不适用于3.x),当有安全更新时,你不希望NuGet's nearest-wins rule导致意外使用具有已知漏洞的包。

这是一个示例,说明 nuget restore REDACTED.All.sln 输出 NU1605 作为一个 _错误_,而不是警告: C:\REDACTED\Services\Application\REDACTED.NativeAPI\REDACTED.NativeAPI.csproj 中的错误 NU1605: 检测到软件包降级:从 Unity 5.1.1 到 4.0.1。直接从项目中引用软件包以选择不同的版本。 REDACTED.NativeAPI -> REDACTED.LegacyPlatform.Common 1.0.189-unity5 -> Unity (>= 5.1.1) REDACTED.NativeAPI -> Unity (>= 4.0.1) - Machinarius
我已经按照以下方式引用了该软件包:<PackageReference Include="REDACTED.LegacyPlatform.Common" NoWarn="1605" PrivateAssets="all"> <Version>1.0.189-unity5</Version> </PackageReference> - Machinarius
如果您在REDACTED.NativeAPI.csproj上运行msbuild /pp:pp.txt,然后搜索NU1605,我相信您会找到一些东西,可能是.NET SDK,使用WarningAsErrors将其升级为警告。NuGet将其提升为警告 - zivkan
我最终通过将Unity 5.11.1重新打包为Unity5 5.11.1,并将其放置在私有NuGet仓库中作为临时措施来简化迁移过程,从而完全避开了这个问题。感谢您的帮助@zivkan。 - Machinarius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接