不同版本的 Nuget 包版本解析

Nuget package version resolution with different versions

我正在使用一个 Nuget 包,它本身引用了 System.Reactive 的先前版本(特别是 4.3.2)。我不是维护者,无法更改,但仍想使用该包。但是,我的解决方案中的所有项目都引用了更新版本的 System.Reactive (5.0.0),目前我无权更改它。这会导致版本冲突。

以前我会使用绑定重定向,但我们最近已经过渡到 .NET Core 和 PackageRefernce,我不清楚如何使用 PackageReference 解决此类版本冲突s.

两个密切相关(我假设)相关的问题:

  1. 是否可以解决上述情况,如果可以,如何解决?
  2. 如何解决相反的情况(外部包中的新版本,我的 solution/projects 中的旧版本)?

使用 .NET Core 时,您会发现在这种情况下不需要绑定重定向。

我会推荐你​​https://docs.microsoft.com/en-us/nuget/concepts/dependency-resolution#dependency-resolution-with-packagereference

如果您遇到 nuget 失败,您可能需要向有问题的库添加直接的 PackageReference,以强制执行“最近取胜”行为。我假设结构是这样的:

Project:
  -> NugetPackage1
    -> System.Reactive (=5.0.0)
  -> NugetPackage2
    -> System.Reactive (=4.3.2)

建议更改为:

Project:
  -> NugetPackage1
    -> System.Reactive (=5.0.0)
  -> NugetPackage2
    -> System.Reactive (=4.3.2)
  -> System.Reactive (5.0.0)

(请注意,只有当包要求明确冲突时才会发生这种失败 - 在这种情况下,两个包都需要一个特定的版本,而不仅仅是一个大于 X 的版本。)

请注意,如果您想让直接 PackageReference 成为两个版本中较低的一个,那也可以。

如果版本冲突是运行时异常,请post异常。

从根本上说,因为您要解决两个不同的 主要 版本,所以目前没有令人满意的解决方法。

System.Reactive 从 4.x 到 5.x 这一事实表明存在重大变化,假设它实际上遵循 SemVer。因此,您所依赖的包完全有可能依赖于 System.Reactive 中已在 5.0.

中删除的内容

除非您想使用 AssemblyLoadContext 作为一种隔离级别自己加载程序集,否则您基本上就不走运了。 .NET simply doesn't handle this situation well at the moment.

我建议你想出最轻松的方法将所有内容都放到同一个主要版本上。这可能意味着:

  • 正在降级您的 System.Reactive 依赖项
  • 说服其他包的维护者升级他们的 System.Reactive 依赖项(这将意味着他们也创建一个新的主要版本...)
  • 分叉其他包以便您可以自己升级其 System.Reactive 依赖项
不幸的是,

None 其中可能很简单。