我应该增加依赖更新的主要版本吗
Posted
技术标签:
【中文标题】我应该增加依赖更新的主要版本吗【英文标题】:Should I increase major version on dependency update 【发布时间】:2019-01-17 17:14:44 【问题描述】:我知道类似的问题是asked before,但出于某种原因,我特意在这个问题上添加了maven
标签。场景:
P
有两个依赖,D1-1.2.3
和D2-2.0.0
D1-1.2.3
具有 D2-1.0.0
作为依赖项
D1
中的类 C
使用(但不公开)来自 D2
的类,该类从版本 1.0.0
到 2.0.0
发生了重大变化
P
使用 C
maven 依赖模型规定,由于 P
的 pom.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,一个好计划。我打算在问题线程上调整我的一个回复并将其发布,但现在我想我会等待该线程的解决。以上是关于我应该增加依赖更新的主要版本吗的主要内容,如果未能解决你的问题,请参考以下文章