Osheep

时光不回头,当下最重要。

06. NPM 世界中的版本号种类

《06. NPM 世界中的版本号种类》

NPM Semver

之前我们以 NPM 为例,说到了语义化版本如何在项目中落地的问题,大家也见识了版本号表示方式的灵活性。今天我们来掰扯掰扯 NPM 世界里的版本号都有哪些表示法以及各自的含义。

版本号

这里我们说的版本都是指 http://semver.org/ 2.0.0 中定义的版本号,版本号中打头的=v字符都会被忽略掉。

区间

版本区间比较器的集合表示,比较器由五种基本逻辑运算符(>>=<<==)表示。如果没有指定运算符,默认为=。一个版本区间可以有多个比较器的集合构成,通过||并起来。比如:

1.2.7 || >=1.2.9 <2.0.0

可以匹配的版本有1.2.7,1.2.9,1.4.6等,但是不会匹配上1.2.8或者2.0.0。

Hyphen(-) 区间

一般形式为:X.Y.Z – A.B.C,表示的是一个闭区间,等价于 >=X.Y.Z <=A.B.C。

如果前半部分不是一个完整的版本号,则默认会以0补全。比如:

1.2 - 2.3.4 等价于 >=1.2.0 <2.3.4

如果后半部分是一个不完整的区间,则所有以该版本号打头的版本都能被接受。比如:

1.2.3 - 2.3 等价于 >=1.2.3 <2.4.0
1.2.3 - 2 等价于 >=1.2.3 <3.0.0

X 区间

常常用xX*来代替【主版本号,次版本号,修订版本号】中的一个数字。比如:

* 等价于 >=0.0.0(任意版本)
1.x 等价于 >=1.0.0 <2.0.0(匹配主版本号)
1.2.x 等价于 >=1.2.0 <1.3.0(匹配主版本号和次版本号)

其实一个不完整的版本号可以认为就是一个 X 区间,只是xX*被省略了,因此这三个特殊的符号其实是可加可不加的。

Tilde(~) 区间

如果只指定了主版本号,则只比较主版本号;如果指定了主版本号和次版本号,则比较二者;如果都指定了,则都比较。比如:

~1 等价于 >=1.0.0 <2.0.0 也等价于 1.x
~1.2 等价于 >=1.2.0 <1.3.0 也等价于 1.2.x
~1.2.3 等价于 >=1.2.3 <1.3.0

Caret(^) 区间

以左起第一个不为零的数字加一构成区间的上限。举例说明:

^1.2.3 等价于 >=1.2.3 <2.0.0
^1.2 等价于 >=1.2.0 <2.0.0 也等价于 ^1.2.x
^1 等价于 >=1.0.0 <2.0.0 也等价于 ^1.x
^0.0.3 等价于 >=0.0.3 <0.0.4 也等价于 =0.0.3
^0.2.3 等价于 >=0.2.3 <0.3.0
^0.0 等价于 >=0.0.0 <0.1.0 也等价于 ^0.0.x
^0 等价于 >=0.0.0 <1.0.0 也等价于 ^0.x

为什么需要这种表示法呢?对于主版本号大与0的版本号来说,看上去似乎没有太大意义。但对于处于开发阶段的0.x 的版本来说,却非常有帮助,因为这个阶段通常我们升级次版本号表示有向下不兼容的改动,这也是社区里的一个常见做法。

参考资料

http://semver.org/spec/v2.0.0.html
https://docs.npmjs.com/misc/semver

点赞