06. NPM 世界中的版本号种类
之前我们以 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 区间
常常用x
,X
,*
来代替【主版本号,次版本号,修订版本号】中的一个数字。比如:
* 等价于 >=0.0.0(任意版本)
1.x 等价于 >=1.0.0 <2.0.0(匹配主版本号)
1.2.x 等价于 >=1.2.0 <1.3.0(匹配主版本号和次版本号)
其实一个不完整的版本号可以认为就是一个 X 区间,只是x
,X
,*
被省略了,因此这三个特殊的符号其实是可加可不加的。
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