不同版本的Nuget包版本解析



我使用的Nuget包本身引用了以前版本的System.Reactive(特别是4.3.2)。我不是维护者,不能改变这一点,但我仍然想使用这个软件包。但是,我的解决方案中的所有项目都引用了较新版本的System.Reactive(5.0.0),我目前不能随意更改它。这会导致版本冲突。

回到那天我会使用绑定重定向,但我们最近已经过渡到。net Core和PackageRefernces,它不清楚我如何解决这样的版本冲突使用PackageReferences。

两个(我认为)密切相关的问题:

  1. 是否有可能解决上述情况,如果有,如何解决?
  2. 如何解决相反的情况(外部包中的新版本,我的解决方案/项目中的旧版本)?

从根本上说,因为您是针对两个不同的主要版本进行解析,所以目前没有令人愉快的方法来解决这个问题。

事实是System.Reactive从4。X到5。x表示有突破性的变化,假设它实际上遵循SemVer。所以你所依赖的软件包完全有可能依赖于System.Reactive中的某些东西,这些东西在5.0中被删除了。

除非你想使用AssemblyLoadContext作为一种隔离级别来自己加载程序集,否则你基本上是不走运的,. net目前根本无法很好地处理这种情况。

我建议你找出最不痛苦的方法把所有的东西都放到同一个主版本上。这可能意味着:

  • 降低System.Reactive依赖
  • 说服其他包的维护者升级他们的System.Reactive依赖(这意味着他们也要创建一个新的主版本…)
  • 创建另一个包,这样你就可以自己升级它的System.Reactive依赖了

不幸的是,这些都不可能是简单的。

当使用。net Core时,你会发现在这种情况下绑定重定向是不必要的。

请参考https://learn.microsoft.com/en-us/nuget/concepts/dependency-resolution#dependency-resolution-with-packagereference

如果你得到一个nuget失败,你可能需要添加一个直接的packagerreference到有问题的库,以强制使用&;Nearest win &;的行为。我假设结构是这样的:

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的版本)

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

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

最新更新