npm 中的 4 位版本控制

Posted

技术标签:

【中文标题】npm 中的 4 位版本控制【英文标题】:4 digit versioning in npm 【发布时间】:2019-04-19 11:30:43 【问题描述】:

我很惊讶 npm 生态系统中不允许 4 位版本控制:

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

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

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

【问题讨论】:

在 semver 和 NPM 中,使用 semver 进行版本控制,构建元数据在排序(优先级)时会被忽略,但可以用于某些匹配场景。后者非常少见,您的客户很难正确使用。 @Asqan,您的目标四位数方案是什么? @Asqan,在 NPM 环境中,您正在对 NPM 包进行版本控制,四位版本字符串适用于哪些工件? 【参考方案1】:

对您的问题的直接回答是肯定的。一些支持包/版本控制的 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'.0X'.Y'.Z'.n 的整个发布历史记录以及在任何nn+1 之间检测新功能和构建中断的一些方法,就不可能从这样的方案转换为semver。在 Nuget/.NET 等情况下,您可以将 B 字段锁定为零并将 semver 应用于其余字段,然后从 Neget/.Net 转换涉及删除额外字段,从 semver 意味着将.0 附加到版本。

要么采用 semver,要么不采用。如果没有,您将不得不忍受各种工具对您不合规的版本字符串大喊大叫。

【讨论】:

Some semver supporting package/versioning tools allow quad numeric version strings 我找不到任何东西。你能用链接更新你的问题吗?我从你的问题中得到转换是一种选择,但在我的情况下没有得到如何实际使用它们。我只想将 package.json 中的版本号替换为 4 位数字,并能够将其构建为版本。 不,我想我基本上已经说明了为什么您不想使用预期为三倍的四倍版本。转换很难正确。如果您不回答我在 cmets 中向您的 OP 提出的问题,我无法给您更多建议。 @jwdonahue semver 允许包含某种预发布信息。我一直在试图弄清楚如何将其包含在 4 数字上下文中,并想提出以下建议——如您上面所说,将数字 1、2 和 3 用于前三个 SemVer 数字。但是对于数字 4,通过增加它直到最终发布来对预发布信息进行编码,此时数字 4 最后一次增加一个。最终版本的任何补丁都应修订为 3 号并清除 4 号。您是否发现此方案有任何问题,或者知道任何其他编码预发布的方法? @Bondolin,最好坚持使用您的工具链支持的任何内容。您提出的方案可能会在某个地方出现问题。

以上是关于npm 中的 4 位版本控制的主要内容,如果未能解决你的问题,请参考以下文章

语义版本控制问题和 npm 5 或更高版本

通过 npm 节点自动化 Git 提交 + 版本控制 + 标记

npm - Semver 版本控制 - 使用插入符号“^”更新包

-next 在语义版本控制中的含义

npm相关依赖操作+版本问题

npm学习之如何使用语义化版本