npm 中的 4 位数字版本控制

4 digit versioning in npm

我很惊讶 npm 生态系统中不允许使用 4 位数字版本:

https://docs.npmjs.com/about-semantic-versioning

但是,我必须将我的最终产品从 npm 合并到其他允许 4 位数字的系统。所以,我的问题是:

(如何)我们自己的项目可以破例使用4位数字?

您问题的直接答案是肯定的。一些支持 package/versioning 的 semver 工具允许四元数字版本字符串,但它们不能将它们解析为字段,必须使用字符串比较或在比较时发出错误,这通常是您在比较版本时不希望发生的情况字符串。换句话说,您丢失了应该在四个版本字段中编码的任何语义。 (有关 NPM's behavior in this case 的描述,请参阅强制主题)

转换是可能的,但通常很难做到正确:

各种 1、2、3、4、...n 字段版本方案的语义各不相同,即使字段数量匹配也是如此。如果有一个版本字符串如“1.1.1”正确翻译成另一个方案为“1.1.1”,这两个方案的语义是相同的,或者“1.1.1”是一个特例。在字段数量变化的情况下,较小方案的字段集可以定位在较大方案字段内的固定偏移处(其余字段具有恒定值)。也可以提取较大方案字段的子集,以转移到较小的方案字段中。在任何情况下,在不违反一个或两个方案的语义的情况下,不可能有一个版本字符串同时适用于较大和较小的方案。

从一种方案转换为另一种方案,需要对两种方案的语义有深刻的理解。许多四位数字方案本质上是带有额外构建计数器的 semver:

X.Y.Z.B
X is major or breaking changes.
Y is minor or non-breaking feature changes.
Z is patch or non-breaking changes that do not add features.
B counts from zero after the last X/Y/Z change.

如果没有 X'.Y'.Z'.0 - X'.Y'.Z'.n 的整个发布历史以及检测新功能和任何 n 之间的构建中断的一些方法,从这样的方案转换为 semver 是不可能的和 n+1。在 Nuget/.NET 等情况下,您可以将 B 字段锁定为零并将 semver 应用于其余字段,然后从 Neget/.Net 进行的翻译涉及删除额外的字段,而从 semver 进行的翻译意味着将 .0 附加到版本。

要么采用 semver,要么不采用。否则,您将不得不忍受各种工具抱怨您的不兼容版本字符串。

您可以这样做,但您需要将最后一个 . 替换为 -。 然而,这是 NON-standard 并且你可能应该确保遵守 npm 的版本控制,以防你想在那里上传你的项目(我不认为它可以阻止任何东西,但保持版本控制在平台。)

例如。你的版本看起来像 1.1.1-1.

我在其他项目中看到了 alpha 版本等,它也允许使用非标准版本号。来自 npm 的一些示例:

  • vue-class-component@8.0.0-rc.1
  • react-docgen@3.0.0-beta7

但是请注意,当您使用任何 npm version major / minor / patch 命令时,它一开始不会增加该数字,而只是截断从第一个 - 字符开始的所有内容。示例:

1.0.6-1

npm version patch

1.0.6

npm version patch

1.0.7

我认为这是因为通常人们使用它来标记一个版本以该顺序在 alpha / beta / rc 中,当版本是最终版本时,您保留版本号但删除后缀。

要实现自动化,您需要制作自己的版本控制 cli,它知道如何处理您的特定版本控制方案。