0%

npm项目中的版本号——什么是语义化版本,为什么要有它?

npm项目版本号遵循语义化版本规范,这个规范目前的版本是:2.0.0。

语义化版本规范

规范文本在这里
主要的规则如下:

版本格式:主版本号.次版本号.修订号

版本号递增规则如下:

主版本号:当你做了不兼容的 API 修改,

次版本号:当你做了向下兼容的功能性新增,

修订号:当你做了向下兼容的问题修正。

先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

其他重要规则:

  1. 1.0.0之前的版本不被认为是稳定版本,这个版本和之后的版本才被认为是公共API。
  2. 主版本号更新,次版本号和修订号都要归零。
  3. 次版本号更新,修订号要归零。
  4. 版本发布后,禁止改变该版本的内容,任何修改都要以新版本发布。
  5. 先行版本低于相关联的标准版本,通常表示稳定性和兼容性都不够。
  6. 先行版本后加在修订号之后,二者之间用“-”连接。
  7. 版本号比较:

版本的优先层级指的是不同版本在排序时如何比较。判断优先层级时,“必须 MUST ”把版本依序拆分为主版本号、次版本号、修订号及先行版本号后进行比较(版本编译信息不在这份比较的列表中)。由左到右依序比较每个标识符号,第一个差异值用来决定优先层级:主版本号、次版本号及修订号以数值比较,例如:1.0.0 < 2.0.0 < 2.1.0 < 2.1.1。当主版本号、次版本号及修订号都相同时,改以优先层级比较低的先行版本号决定。例如:1.0.0-alpha < 1.0.0。有相同主版本号、次版本号及修订号的两个先行版本号,其优先层级“必须 MUST ”透过由左到右的每个被句点分隔的标识符号来比较,直到找到一个差异值后决定:只有数字的标识符号以数值高低比较,有字母或连接号时则逐字以 ASCII 的排序来比较。数字的标识符号比非数字的标识符号优先层级低。若开头的标识符号都相同时,栏位比较多的先行版本号优先层级比较高。范例:1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0- rc.1 < 1.0.0。

可见,定制语义化版本规范是为了便于不同的开发者相互协作。

npm 版本范围声明

基本

  1. < 低于指定版本
  2. <= 低于等于指定版本
  3. > 高于指定版本
  4. >= 高于等于指定版本
  5. = 等于指定版本。不使用任何符号就默认采用等于号。

先行版本

如果指定了先行版本,版本范围不会超过该版本对应的标准版本。这是由先行版本的特殊情况决定的。

进阶

  1. - 表示两个版本之间的版本(包含两端)。
  2. *(X or x),通配符。
  3. ~ 表示在当前版本的修订版本号范围内变化。
  4. ^ 表示的范围大于等于当前版本,小于最左侧非零数字变化的版本。

举例说明^符号的作用:

1
2
3
4
5

^1.2.3 := >=1.2.3 <2.0.0
^0.2.3 := >=0.2.3 <0.3.0
^0.0.3 := >=0.0.3 <0.0.4
^1.2.3-beta.2 := >=1.2.3-beta.2 <2.0.0

通过例子可以发现^表示的范围和指定的版本号有很大的关联,对于1.0.0以上的版本号,^表示的范围能达到下一个兼容版本。但对于1.0.0以下的版本号,其表示的范围非常的小。这也和非公共API版本的特性有关。

参考

语义化版本
npm语义化版本