转自 http://www.u396.com/semver-range.html
在使用 Node.js
和 Bower
的时候,其中的 package.json
和 bower.json
都会有 dependencies
、devDependencies
项,对于此前端开 发的童鞋应该会比较熟悉。这里面是运行时和开发时依赖库,其中依赖库对应的版本号有很多种写法,诸如:”~1.0.2“
, “^1.0“
, “>=1.0.2“
等,其实可以猜测这种写法代表了某种范围,至于具体含义本文给大家做详细解释。
语义化版本格式
我们首先简单了解一下语义化版本版本号,标准的版本格式为:X.Y.Z
,其中:
X
:主版本号,当我们做了不兼容或者颠覆性的更新,修改此版本号。Y
:此版本号,当我们做了向下兼容的功能性修改,修改此版本号。Z
:修订号,当我们做了向下兼容的问题修正,修改此版本号。
其中X
、Y
和Z
必须为非负整数,禁止数字前补零,每个数值都是递增的。
标题语义化版本范围
版本范围是一组满足指定范围的比较器,一个比较器是由操作符和版本号组成,下面是最原始的操作符:
-
<
小于; -
<=
小于等于; -
>
大于; -
>=
大于等于; -
=
等于;如果没有指定操作符,则默认为等于。
一个范围可由一个或者多个比较器组成,如果有多个,则由双竖线(||)连接。对于包含多个比较器,只要满足其一即可。比如: -
范围
>=1.2.7 <1.3.0
,版本号1.2.7
,1.2.8
,1.2.99
满足条件,而1.2.6
,1.3.0
,1.1.0
确不满足。 -
范围
1.2.7 || >=1.2.9 <2.0.0
,版本号1.2.7
,1.2.9
,1.4.6
满足,而1.2.8
或者2.0.0
不满足。
标题关于测试版
Alpha
、Beta
、Gamma
与α
、β
、λ
谐音,是希腊字母前三个字母,用来表示软件开发过程中测试的三个阶段:
Alpha
:内测版,内部交流或者专业测试人员测试用;Beta
:公测版,专业爱好者大规模测试用,存在一些缺陷,该版本也不适合一般用户安装;Gamma
:比较成熟的测试版,与即将发行的正式版相差无几;RC
:是Release Candidate
的缩写,意思是发布倒计时,候选版本,处于Gamma阶段,该版本已经完成全部功能并清除大部分的BUG
。到了这个阶段只会除BUG
,不会对软件做任何大的更改。从Alpha
到Beta
再到Gamma
是改进的先后关系,但RC1
、RC2
往往是取舍关系。Stable
:稳定版。在开源软件中,都有stable
版,这个就是开源软件的稳定发行版。
范围>1.2.3-alpha.3
,版本1.2.3-alpha.7
符合条件,而3.4.5-alpha.9
却不满足条件。虽然 3.4.5-alpha.9
实际上大于 1.2.3-alpha.3
,但是根据 SemVer
的排序规则,这个版本范围只是接受 1.2.3
的测试版,而不接受其他版本的测试版。当然 3.4.5
满足条件,因为它不是测试版,并且大于 1.2.3-alpha.7
。
这么做是有两个目的,首先测试版会经常更新并且可能包含不适合公开的重大改动,因此被排除在范围之外;
再者,虽然用户明确此次使用有风险的测试版本,然而下一版本的测试版被包含进来仍然是不合适的。
标题版本范围高级用法
在版本范围的高级用法中,与原始的比较器不同,组合不仅仅限于空格和双竖线,它有以下几种方式。
连接符(-)范围 X.Y.Z - A.B.C
下面表示的闭包集合
-
1.2.3 - 2.3.4 := >=1.2.3 <=2.3.4
如果范围中的第一个版本号只有一部分,剩下的部分以零填充。 -
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范围 1.2.x 1.X 1.2.* *
X
, x
或者 *
可以用在主版本号、此版本号以及修订版本号的任何一个上面。
-* := >=0.0.0 (任何版本都满足)
1.x := >=1.0.0 <2.0.0 (只要满足主版本号即可)
1.2.x := >=1.2.0 <1.3.0 (需要满足主版本和此版本号)
部分版本号的含义与X
范围表示含义一样,所以X或者*
都是可以省略的。
-"" (空字符串) := * := >=0.0.0
1 := 1.x.x := >=1.0.0 <2.0.0
1.2 := 1.2.x := >=1.2.0 <1.3.0
波浪线(~)范围 ~1.2.3 ~1.2 ~1
~1.2.3 := >=1.2.3 <1.(2+1).0 := >=1.2.3 <1.3.0
~1.2 := >=1.2.0 <1.(2+1).0 := >=1.2.0 <1.3.0 (类似于 1.2.x)
~1 := >=1.0.0 <(1+1).0.0 := >=1.0.0 <2.0.0 (类似于 1.x)
~0.2.3 := >=0.2.3 <0.(2+1).0 := >=0.2.3 <0.3.0
~0.2 := >=0.2.0 <0.(2+1).0 := >=0.2.0 <0.3.0 (类似于 0.2.x)
~0 := >=0.0.0 <(0+1).0.0 := >=0.0.0 <1.0.0 (类似于 0.x)
~1.2.3-beta.2 := >=1.2.3-beta.2 <1.3.0
注意版本为1.2.3
且大于等于beta.2
的测试版本在范围内,因此1.2.3-beta.4
满足条件,而1.2.4-beta.2
不满足条件。
补注号(^)范围 ^1.2.3 ^0.2.5 ^0.0.4
允许在不修改[major, minor, patch]
中最左非零数字的更改。换句话说,允许在 1.0.0
及以上版本对次版本号和修订版本号的更新,允许在 0.1.0
以及以上版本对修订版本号更新,版本为 0.0.X
不允许更新。
^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
^0.0.3-beta := >=0.0.3-beta <0.0.4
-^1.2.x := >=1.2.0 <2.0.0
^0.0.x := >=0.0.0 <0.1.0
^0.0 := >=0.0.0 <0.1.0
^1.x := >=1.0.0 <2.0.0
^0.x := >=0.0.0 <1.0.0