SemVer:新功能可以被认为是重大变化吗?

Posted

技术标签:

【中文标题】SemVer:新功能可以被认为是重大变化吗?【英文标题】:SemVer: can new functionality be considered breaking change? 【发布时间】:2016-05-13 06:58:13 【问题描述】:

考虑在 1.0.0 版本(语义版本控制)中定义一个类 A 的库,该类具有多个方法(A1、A2、...)

现在假设我向 A 对象添加了一个新方法(方法 Ab)。这是小版本吗?因为它增加了功能,它不应该是一个突破性的变化。 但是,如果使用该库的人声明了一个扩展类 B 的类 A,并且 B 定义了一个与新方法具有相同签名的方法 Ab,那么现在代码将无法编译,因为它需要覆盖声明(在 Scala 和 Java 中) .

那么,这是一个突破性的变化吗?

【问题讨论】:

【参考方案1】:

首先,一般来说,向类添加公共方法并不是语义版本控制的重大变化。然而,删除公共方法将是一个明显的重大变化。

如果您提供一个 Java 库并且您添加一个方法到 interface,这一个重大更改,因为其他人必须更改/扩展他们的代码。

如果你添加一个公共方法到class,这只会是一个问题,如果这个类不是最终的,那么其他人可以扩展它并覆盖方法。

所以我认为最好的方法是将class 声明为final,因此方法覆盖的问题永远不会发生。您也可以离开主要更新,只增加次要更新。向接口添加方法将是一个重大更改,因此您应该增加主版本。

【讨论】:

所以我们可以说它在某种程度上取决于编程语言?根据我的经验,在 Java/Scala 中将一个类声明为 final 是很少见的。但是我们应该说向(非最终)类添加公共方法是一项重大更改吗? 在我看来,SemVer 不依赖于编程语言。但是编程语言及其对库的使用定义了您必须更新版本以遵循它的方式。 就个人而言,如果我向类中添加公共方法,我不会将其定义为重大更改。但严格来说,如果它不是最终版本,我认为你应该这样做。

以上是关于SemVer:新功能可以被认为是重大变化吗?的主要内容,如果未能解决你的问题,请参考以下文章

semver 2.0.0 的重大变化是啥

更具体的 HTTP 代码是“Semver 重大更改”吗?

你知道从 detox@12 到 detox@13 的重大变化吗?

我的 Cloud 功能停止使用 Flutter Web 有啥重大变化吗?

Docker 1 12新功能探索 新增重大特性

如何 semver 版本控制文档更新?