再次回顾一下版本号的组成: 主版本号.次版本号.修订号 (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 。