不同版本的 Nuget 包版本解析
Nuget package version resolution with different versions
我正在使用一个 Nuget 包,它本身引用了 System.Reactive
的先前版本(特别是 4.3.2)。我不是维护者,无法更改,但仍想使用该包。但是,我的解决方案中的所有项目都引用了更新版本的 System.Reactive
(5.0.0),目前我无权更改它。这会导致版本冲突。
以前我会使用绑定重定向,但我们最近已经过渡到 .NET Core 和 PackageRefernce
,我不清楚如何使用 PackageReference
解决此类版本冲突s.
两个密切相关(我假设)相关的问题:
- 是否可以解决上述情况,如果可以,如何解决?
- 如何解决相反的情况(外部包中的新版本,我的 solution/projects 中的旧版本)?
使用 .NET Core 时,您会发现在这种情况下不需要绑定重定向。
如果您遇到 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 其中可能很简单。
我正在使用一个 Nuget 包,它本身引用了 System.Reactive
的先前版本(特别是 4.3.2)。我不是维护者,无法更改,但仍想使用该包。但是,我的解决方案中的所有项目都引用了更新版本的 System.Reactive
(5.0.0),目前我无权更改它。这会导致版本冲突。
以前我会使用绑定重定向,但我们最近已经过渡到 .NET Core 和 PackageRefernce
,我不清楚如何使用 PackageReference
解决此类版本冲突s.
两个密切相关(我假设)相关的问题:
- 是否可以解决上述情况,如果可以,如何解决?
- 如何解决相反的情况(外部包中的新版本,我的 solution/projects 中的旧版本)?
使用 .NET Core 时,您会发现在这种情况下不需要绑定重定向。
如果您遇到 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 其中可能很简单。