语义版本控制和依赖性更改

Semantic Versioning and Dependency Changes

一些背景:我在一个团队工作,该团队生产 6 个不同的 NuGet 包,它们直接相互依赖,有时间接相互依赖。简单地说,我们可能会遇到类似 p0 < p1 < p2 的情况,其中包 p0 依赖于 p1,而后者又依赖于 p2。我们正在尝试遵循这些软件包的 Semantic Versioning,但不太确定当 p1p2 发生变化时如何处理 p0 的版本。

这里有一些具体的例子:

更重要的是,

Is there any standard / consensus on how dependency version changes should affect package version changes?

语义版本控制是关于更改对该库的用户意味着什么。因此,如果 p1 中的更改不会导致 p0 中的重大更改,那么我不明白为什么它需要 p0.

中的主要版本提升

基本上,使用任何版本的依赖库(请记住,根据您的依赖规则,您的用户也可以使用不同的版本覆盖它们!),您的版本控制应该只反映会影响您的用户的内容。

警告,前面有基于意见的内容

在我看来,如果您直接使用传递依赖项(即使用 p1 但仅将 p0 列为依赖项)作为图书馆的客户。当你有一个 lot 的依赖项(就像在大多数 NPM 包中一样)向下很多很多层时,这会加倍。我不希望这些库的作者跟踪所有传递依赖项的所有版本更改,所以我知道要检查。

绝不暗示@BradleyDotNET 的出色回答是不够的。我只想补充一下我的看法。

p1 makes a breaking change (say 0.0.0 → 1.0.0). We want to publish a version of p0 which depends on 1.0.0. Should this be a major or minor version bump for p0?

是的,您正在向 p0 的用户引入重大更改。

p1 makes a minor changes (0.0.0 → 0.1.0). Should this make a minor / patch version bump for p0?

如果p1的附加接口暴露在p0接口中,那就是minor。如果依赖在实现层,那就打补丁。这里真正的问题是你为什么要进行这种依赖性改变?如果是给p0public面添加接口,那么就是p0的minor bump,否则就是patch level bump.

这里要考虑的另一件事是您要将版本号应用到什么地方。包、库和接口都是不同的东西,它们都可以独立于版本。正如 BradleyDotNET 指出的那样,一些包包含独立版本化工件的集合。您可能需要考虑修改您的策略,以便您的接口可以有稳定的版本,尽管经常重新打包。