"Nearest-Wins" 依赖解析和向后兼容性
"Nearest-Wins" dependency resolution and backwards compatibility
当提到 this ASP.NET github wiki page 时,它解释了如何使用 "Nearest Win" 方案丢弃同名(但不同版本)的包:
Nearest wins means that the dependency resolver prefers versions that
are "closer" to the application, but only if they are an ancestor of
the dependency being rejected.
给出的示例解释了下图中如何丢弃 Package B 1.0
因为 Package B 2.0
是 "closer":
这是否意味着 Package A
现在将使用 Package B 2.0
?当然这没有意义,除非 Package B 2.0
向后兼容 Package B 1.0
?
根据 semantic versioning,上述软件包不一定向后兼容。
这意味着MyApp将使用PackageB 2.0,也意味着MyApp上下文中的packageA将使用PackageB 2.0。请注意,在包图中,任何单个包始终只有一个版本,这对于 package.config 世界来说是正确的,这里没有变化。在 packages.config 世界中,决定是由用户在安装包时做出的,而这里的决定是在恢复时做出的。
因为总是由 MyApp 的用户或作者在 project.json 或 nuspec 中创建依赖关系图(如果 MyApp 也是一个包),他有权选择哪个版本使用。
你是对的,在这种情况下,根据语义版本控制规则存在潜在的重大变化。在这个示例中,作者决定它不会影响它的应用程序,或者用你的话来说,它足够向后兼容供他使用。
另一个需要记住的重要方面是,应用该规则是因为作者 MyApp 有权进行更改,而不是因为包 B2.0 任意地更接近图中的根。查看表亲依赖规则,了解这种边缘情况。
问题参考的最后一个文档不是官方指南 - 它可以在这里找到 - https://docs.microsoft.com/en-us/nuget/consume-packages/dependency-resolution
当提到 this ASP.NET github wiki page 时,它解释了如何使用 "Nearest Win" 方案丢弃同名(但不同版本)的包:
Nearest wins means that the dependency resolver prefers versions that are "closer" to the application, but only if they are an ancestor of the dependency being rejected.
给出的示例解释了下图中如何丢弃 Package B 1.0
因为 Package B 2.0
是 "closer":
这是否意味着 Package A
现在将使用 Package B 2.0
?当然这没有意义,除非 Package B 2.0
向后兼容 Package B 1.0
?
根据 semantic versioning,上述软件包不一定向后兼容。
这意味着MyApp将使用PackageB 2.0,也意味着MyApp上下文中的packageA将使用PackageB 2.0。请注意,在包图中,任何单个包始终只有一个版本,这对于 package.config 世界来说是正确的,这里没有变化。在 packages.config 世界中,决定是由用户在安装包时做出的,而这里的决定是在恢复时做出的。
因为总是由 MyApp 的用户或作者在 project.json 或 nuspec 中创建依赖关系图(如果 MyApp 也是一个包),他有权选择哪个版本使用。
你是对的,在这种情况下,根据语义版本控制规则存在潜在的重大变化。在这个示例中,作者决定它不会影响它的应用程序,或者用你的话来说,它足够向后兼容供他使用。
另一个需要记住的重要方面是,应用该规则是因为作者 MyApp 有权进行更改,而不是因为包 B2.0 任意地更接近图中的根。查看表亲依赖规则,了解这种边缘情况。
问题参考的最后一个文档不是官方指南 - 它可以在这里找到 - https://docs.microsoft.com/en-us/nuget/consume-packages/dependency-resolution