如何忽略 NuGet NU1605?

Mac*_*ius 2 c# unity-container nuget

我有一个包含许多项目和内部 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 接受这个奇怪的设置?

ziv*_*kan 5

您有两种选择来抑制该代码。一种是使用<NoWarn>NU1605</NoWarn>msbuild 属性(必须在 a 中定义PropertyGroup)。Visual Studio 的项目属性可能有一种在 UI 中对其进行编辑的方法。

另一种选择是将NoWarn="NU1605"元数据添加到您的 ProjectReference 项中:

  <ProjectReference Include="package id" Version="1.2.3" NoWarn="NU1605" />
Run Code Online (Sandbox Code Playgroud)

最后,NuGet 实际上将 NU1605 报告为警告,如果您仔细阅读文档页面标题,您可能会注意到这一点。.NET Core SDK 使用该WarningsAsErrors属性将其提升为警告。因此,如果您对 MSBuild 足够精通,则可以在添加后将其删除,或者检查如何防止将其添加到列表中。我对动机的猜测是因为 BCL 是作为 .NET Core 1.x 和 2.x 的包分发的(它不会用于 3.x),并且当有安全更新时,你不希望NuGet 是最近的-wins 规则导致意外使用具有已知漏洞的包。