NuGet 警告 NU1605

示例 1

检测到包降级:“PackageB”从 4.0.0 降级到 3.5.0。 直接从项目引用包以选择其他版本。
'Project' -> 'PackageA' 4.0.0 -> 'PackageB' (>= 4.0.0)
'Project' -> 'PackageB' (>= 3.5.0)

问题

依赖关系包对更高版本的包指定了版本约束,而不是还原最终解析的版本。 这是因为 direct-dependency-wins 规则在解析包时,子图中的直接包版本会覆盖具有相同 ID 的遥远包版本。

解决方案

若要显示还原警告的项目,请添加对更高版本包的包引用。

在以上示例中,将包引用更改为 PackageB 4.0.0:

  'PackageA' 4.0.0 -> 'PackageB' 4.0.0
'PackageB' 4.0.0

示例 2

检测到包降级:“PackageC”从 2.0.0 降级到 1.1.0。 直接从项目引用包以选择其他版本。
'Project' -> 'PackageA' 1.0.0 -> 'PackageB' 2.0.0 ->'PackageC' (>= 2.0.0)
'Project' -> 'PackageA' 1.0.0 -> 'PackageC' (>= 1.1.0)

问题

依赖关系包对更高版本的包指定了版本约束,而不是还原最终解析的版本。 这是因为 direct-dependency-wins 规则在解析包时,NuGet 会尝试遵循包作者的意图。 PackageA 的作者已从 PackageC 1.1.0 显式降级到 PackageC 2.0.0。

解决方案

若要显示还原警告的项目,请添加对更高版本包的包引用。

在以上示例中,将包引用更改为 PackageC 2.0.0:

  'PackageA' 4.0.0 -> 'PackageB' 4.0.0
'PackageB' 4.0.0

示例 3

Detected package downgrade: System.IO.FileSystem.Primitives from 4.3.0 to 4.0.1. Reference the package directly from the project to select a different version.
Project -> System.IO.FileSystem 4.0.1 -> runtime.win.System.IO.FileSystem 4.3.0 -> System.IO.FileSystem.Primitives (>= 4.3.0)
Project -> System.IO.FileSystem 4.0.1 -> System.IO.FileSystem.Primitives (>= 4.0.1)

问题

.NET Core 1.0 和 1.1 附带的某些包组合在 .NET Core 3.0 或更高版本中同时引用并指定 RuntimeIdentifier 时会彼此不兼容。 有问题的包通常会以 System.Microsoft. 开头,且版本号介于 4.0.0 到 4.3.1 之间。 在此情况下,降级消息会包含在依赖关系链中以 runtime.<RID> 开头的包。

解决方案

若要解决此问题,请添加以下 PackageReference:

<PackageReference Include="Microsoft.NETCore.Targets" Version="3.0.0" PrivateAssets="all" />

可选择使用与 SDK 主版本匹配的 version

示例 4

检测到包降级:Microsoft.NETCore.App 从 2.1.8 降级到 2.1.0。 直接从项目引用包以选择其他版本。
test -> mvc -> Microsoft.NETCore.App (>= 2.1.8)
test -> Microsoft.NETCore.App (>= 2.1.0)

问题

mvc 项目对更高版本的包指定了版本约束,而不是还原最终解析的版本。 这是因为 direct-dependency-wins 规则在解析包时,图中的直接引用包版本会覆盖具有相同 ID 的遥远包版本。

解决方案

通过将 .NET Core SDK 升级到 2.2.100 或更高版本可改进此特定错误(带 Microsoft.NETCore.App 包)。 Microsoft.NETCore.App 是 .NET Core SDK 在版本 3.0.100 之前选择自动引入的自动引用包。 另请参阅自包含的部署运行时前滚

注意

虽然 NU1605 被视为 NuGet 工具的警告,但 .NET SDK 选择将此警告视为通过 WarningsAsErrors 发出的错误。 你的项目可能会通过将 TreatWarningsAsErrors 设为 true 从而将此警告升级为错误。 由于更有可能遇到运行时问题,因此虽然不建议这样做,但仍可选择不显示此警告。

提示

替代解决方案:NuGetSolver 是由 Microsoft DevLabs 开发的 Visual Studio 扩展,旨在帮助解决依赖项冲突问题。 它可以自动执行识别和解决这些问题的过程。 有关更多详细信息,请访问 Visual Studio Marketplace 上的 NuGetSolver 页面,我们很乐意听取您的体验反馈。