【问题标题】:Nuget package version resolution with different versions不同版本的Nuget包版本解析
【发布时间】:2021-02-10 20:31:44
【问题描述】:

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

过去我会使用绑定重定向,但我们最近已转换到 .NET Core 和 PackageRefernces,我不清楚如何使用 PackageReferences 解决此类版本冲突。

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

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

【问题讨论】:

  • 您描述的方式应该没问题(请注意,当您在包引用中有单个版本时,您实际上是在说您很高兴有任何版本大于或等于那个,没有指定具体的单一版本)。如果你发布你的错误,你可能会有更好的机会得到答案
  • @rbennett485:我不明白它应该如何被期望 - 指定版本号在 SemVer 术语中意味着“任何更大的版本”,甚至如果 NuGet 以这种方式对待它。我预计在 4.x 和 5.x 之间会有重大变化,我们无法知道 OP 所依赖的包是否会被这些重大变化破坏。
  • @JonSkeet 问题并不清楚,但我假设版本控制冲突意味着 NuGet 解析版本的错误,而不是主要 semver 版本之间的二进制不兼容导致的运行时异常
  • @rbennett485:我想说的是,即使它不会导致 NuGet 出错,仍然从根本上存在版本冲突,只是可能被 NuGet 掩盖。我当然不会将这种情况描述为“这应该没问题”。也许“这不应该导致 NuGet 解析出现问题”,但这距离“很好”还有很长的路要走。
  • @JonSkeet 这对于系统包来说可能是合理的,但一般来说,NuGet 包的发布者在 semver 方面非常糟糕,以至于我倾向于同意 NuGet 工具将主要颠簸视为与任何相同的模型其他

标签: c# .net-core nuget-package


【解决方案1】:

从根本上说,因为您要解决两个不同的主要版本,所以目前没有解决这个问题的愉快方法。

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 依赖项

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

【讨论】:

  • 谢谢@JonSkeet - 我担心这会是答案,但我非常感谢你概述我的选择。我想是时候惹恼维护者了!
【解决方案2】:

使用 .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 成为两个版本中较低的版本,那也可以。

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

【讨论】:

  • 这不太正确 - 您的第一个示例是可解析的(NuGet 选择 v5.0.0),而在第二个示例中,如果您要直接引用两个版本中的较低版本,您将获得一个包参考降级
  • 感谢您的有用评论。我已经更新了答案,希望能正确地解决 nuget 的问题。关于包参考降级 - 是的,您会收到警告。我假设如果用户想要这种行为,他们会收到警告。
猜你喜欢
  • 2021-10-13
  • 2018-06-13
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 2021-07-10
  • 1970-01-01
  • 2019-12-21
相关资源
最近更新 更多