再次回顾一下版本号的组成: 主版本号.次版本号.修订号
(major.minor.patch
)。
[major, minor, patch]
元组中最左边非零元素的更改。换句话说,这允许对 1.0.0
及以上版本进行补丁和次要更新,对 0.X >=0.1.0
版本进行补丁更新,对 0.0.X
版本不进行更新。
^1.2.3
:=1 >=1.2.3 <2.0.0-0
^0.2.3
:= >=0.2.3 <0.3.0-0
^0.0.3
:= >=0.0.3 <0.0.4-0
^1.2.3-beta.2
:= >=1.2.3-beta.2 <2.0.0-0
^0.0.3-beta
:= >=0.0.3-beta <0.0.4-0
^1.2.x
:= >=1.2.0 <2.0.0-0
^0.0.x
:= >=0.0.0 <0.1.0-0
^0.0
:= >=0.0.0 <0.1.0-0
^1.x
:= >=1.0.0 <2.0.0-0
^0.x
:= >=0.0.0 <1.0.0-0
在正则表达式中, ^
表示匹配匹配字符串的开头,利用这个联想, ^
表示的就是从头(最左边)开始,找第一个非 0 的版本号,固定这一位版本号。
例如 ^0.1.2
,从头开始第一个非 0 的版本号是第二位版本号 1
,因此第二位之前都是固定的,因此可以推断出它表示的范围是 >=0.1.2 <0.2.0
。
再如 ^1
, 首先补全到 3 位版本号,即 ^1.0.0
,从头开始第一个非 0 的版本号是第一位的 1
,因此第一位版本号是固定的,范围是 >=1.0.0 <2.0.0
。
特殊的 ,当 3 位版本号都是 0 的时候,即 ^0.0.0
, 此时从头往后找不到非 0 的版本号,则固定第一位,即固定主版本号,其他版本号随意,范围是 >=0.0.0 <1.0.0
。
次版本号
,则允许进行 修订号
修改。如果没有,则允许 次版本号
的更改。
~1.2.3
:= >=1.2.3 <1.3.0-0
~1.2
:= >=1.2.0 <1.3.0-0
(Same as 1.2.x
)~1
:= >=1.0.0 <2.0.0-0
(Same as 1.x
)~0.2.3
:= >=0.2.3 <0.3.0-0
~0.2
:= >=0.2.0 <0.3.0-0
(Same as 0.2.x
)~0
:= >=0.0.0 <1.0.0-0
(Same as 0.x
)~1.2.3-beta.2
:= >=1.2.3-beta.2 <1.3.0-0
~
常见于表示的一个范围,例如 1 ~
3, 它往往是夹在中间的,也就是中间第二位,而它的作用就是针对第二位的 次版本号(minor)
, 如果第二位(minor)存在,则可以改第三位(patch);如果第二位(minor)不存在,则可以改第二位(minor)。
例如 ~1.2.3
, 第二位 2
,存在第二位,因此固定第二位,范围是 >=1.2.3 < 1.3.0
。
例如 ~1.0.3
, 第二位 0
,存在第二位,因此固定第二位,范围是 >=1.0.3 < 1.1.0
。
例如 ~1
, 不存在第二位,因此可以修改第二位,范围是 >=1.0.0 <2.0.0
。
例如 ~0
, 不存在第二位,因此可以修改第二位,范围是 >=0.0.0 <1.0.0
。