我应该增加依赖更新的主要版本吗

Posted

技术标签:

【中文标题】我应该增加依赖更新的主要版本吗【英文标题】:Should I increase major version on dependency update 【发布时间】:2019-01-17 17:14:44 【问题描述】:

我知道类似的问题是asked before,但出于某种原因,我特意在这个问题上添加了maven 标签。场景:

项目P有两个依赖,D1-1.2.3D2-2.0.0 D1-1.2.3 具有 D2-1.0.0 作为依赖项 D1 中的类 C 使用(但不公开)来自 D2 的类,该类从版本 1.0.02.0.0 发生了重大变化 P 使用 C

maven 依赖模型规定,由于 Ppom.xml 明确声明了 D2 依赖,因此将使用来自 pom 的版本。这会导致P 因传递依赖的不兼容更改而因链接错误而中断。

semver FAQ 声明这是一个兼容的更改。它确实说“因为它不影响公共 API”,但在我概述的场景中,每次对依赖项的更新都隐含着因链接错误而破坏消费者的风险。

D1应该增加主版本吗?这部分 semver 规范是否因为其依赖模型而根本不适合 maven 项目?

【问题讨论】:

问题是你的类C(它的接口)是否需要基于传递变化而改变。如果你能保留它。这不是重大更改,因为如果您需要更改“接口”,您的 API 是稳定的,这将是重大更改..并导致主要版本更改...除此之外,我会在您的文件中明确命名版本更改更改日志... 【参考方案1】:

更改是否兼容,在这种情况下,完全取决于 API 消费者如何使用它,这超出了 API 开发人员的责任。

D1 的开发人员而言,公共 API 保持不变,而且,IMO 声明这不是重大变化是正确的。

如果使用D1 的应用程序也直接 使用D2,因为它恰好是一个编译范围的依赖,那么这完全是消费者的责任。如何?消费者无论如何都可以排除传递依赖并将其替换为不同的版本,并且多个消费者以不同的方式管理传递依赖。

正如您所说,这大部分是依赖项在 Maven 或 Java 中如何工作的结果,但将 API 开发人员的责任限制在公共 API 上是明智的。

【讨论】:

“消费者无论如何都可以排除传递性依赖”——但这也无济于事,不是吗? D1 的公共 API 中公开的一个方法使用(并且已针对)D2 的早期版本进行编译。首先出现链接错误的原因是P 在其 pom 中有一个较新的版本(更改不兼容),而不是相反 @EvenLisle 那么问题比这里的版本控制更基本......实现细节已经泄露到公共 API 中。如果这是可以接受/可以接受的,那么我同意您的观点,即更新版本是合适的。但这是无法管理的。 “就 D1 的开发人员而言,公共 API 保持不变”——我既同意又不同意。我同意他们不可能知道是否会发生这样的事情。但我要说的是——在 maven 的情况下——我们永远不能假设用重大更改更新依赖项不会破坏公共 API 因为 OP 有一个active thread on the semver project on github,所以重新访问这个。 @ernest_k,一个好计划。我打算在问题线程上调整我的一个回复并将其发布,但现在我想我会等待该线程的解决。

以上是关于我应该增加依赖更新的主要版本吗的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该在 package.json 中增加依赖版本?

Linux 发布管理系统

主要的 SemVer 更新应该级联吗?

我应该在构建软件时自动增加程序集版本吗?

更新依赖项是不是会破坏向后兼容性(semver 主要版本更改)?

数据库模式更改是不是应该增加语义版本控制中的主要版本?