“最近获胜”依赖解析和向后兼容性

Dav*_*New 5 nuget visual-studio-2015 .net-4.6 asp.net-core

当引用此 ASP.NET github wiki 页面时,它解释了如何使用“Nearest Win”场景丢弃同名(但不同版本)的包:

最近的获胜意味着依赖项解析器更喜欢与应用程序“更接近”的版本,但前提是它们是被拒绝的依赖项的祖先。

给出的示例解释了下图中如何因为“更接近”而Package B 1.0被丢弃:Package B 2.0

最近获胜依赖解析

这是否意味着Package A现在会使用Package B 2.0Package B 2.0当然,除非向后兼容,否则这没有任何意义Package B 1.0

根据语义版本控制,上述包不一定向后兼容。

Yis*_*zer 3

这意味着 MyApp 将使用 PackageB 2.0,也意味着 MyApp 上下文中的 packageA 将使用 PackageB 2.0。请注意,在包图中,任何单个包始终只有一个版本,这对于 package.config 世界来说是正确的,并且这里没有任何更改。在packages.config 世界中,该决定是由用户在包安装时做出的,而这里的决定是在恢复时做出的。

由于始终是 MyApp 的用户或作者在 project.json 或 nuspec 中编写依赖关系图(如果 MyApp 也是一个包),因此他有权选择要使用的版本。

您是对的,在这种情况下,根据语义版本控制规则,存在潜在的重大更改。在此示例中,作者认为它不会影响其应用程序,或者用您的话来说,它向后兼容足以供他使用。

要记住的另一个重要方面是,该规则适用是因为作者 MyApp 有权进行更改,而不是因为包 B2.0 任意接近图中的根。查看表兄弟依赖规则,以了解这种边缘情况。

最后问题引用的文档不是官方指南 - 可以在这里找到 - https://learn.microsoft.com/en-us/nuget/consume-packages/dependency-resolution