semver

3 4月

semver提供了语义化版本号([major, minor, patch])的便捷API。

基础用法

  • 默认会忽略头上的=v
  • 支持设置操作符:<,<=,>,>=,=(默认值,不设操作符的话,默认就是=等于)
const semver = require('semver');

semver.valid('1.2.3');        // 1.2.3
semver.valid('a.b.c');        // null
semver.parse('1.2.3');        // 尝试将字符串解析为SemVer对象 { ...raw: '1.2.3', version: '1.2.3' }

semver.major('1.2.3');        // 1
semver.minor('1.2.3');        // 2
semver.patch('1.2.3');        // 3

预处理版本 prerelease tags

当有prerelease tag时,只比较tag的版本。例如当判断是否>1.2.3-alpha.3时,3.4.5-alpha.9虽然理论上大于1.2.3-alpha.3,但仍旧返回false。1.2.3-alpha.7能返回true。(你可以设置includePrerelease来将prerelease版本当做普通版本处理)

可以用.inc(v, type)方法,是个自增+1方法,可以用于设置prerelease tag。支持的type有:major,premajor,minor,preminor,patch,prepatch,prerelease

可以用.prerelease(v) 方法,获取prerelease tag信息。

const semver = require('semver');

semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3'); // true
semver.satisfies('1.2.3-alpha.7', '>1.2.3-alpha.3');          // true,只比较tag的版本
semver.satisfies('3.4.5-alpha.9', '>1.2.3-alpha.3');          // false,只比较tag的版本,即便理论上前者更大

semver.inc('1.2.3', 'prerelease', 'beta'));                   // 1.2.4-beta.0
semver.inc('1.2.4-beta.0', 'prerelease'));                    // 1.2.4-beta.1

semver.prerelease('1.2.3-alpha.1');                           // ['alpha', 1]

范围

X.Y.Z – A.B.C:两头闭区间,相当于>=X.Y.Z & <=A.B.C

x X *:起始闭区间,占位符,比较主次从版本号

~:起始闭区间,补丁位升级,如果没有补丁位,就从次位开始升级。

^:起始闭区间,允许最左边非0位的升级。如果x的前面都是0,从离x最近的0开始升级。

1.2.3 - 2.3.4 相当于 >=1.2.3 & <=2.3.4
1.2.3 - 2     相当于 >=1.2.3 & <3.0.0

1.2.x         相当于 >=1.2.0 & <1.3.0(比较主次版本号)
1.x           相当于 >=1.0.0 <2.0.0(比较主版本号)
1             相当于 1.x.x 相当于 >=1.0.0 & <2.0.0
1.2           相当于 1.2.x 相当于 >=1.2.0 & <1.3.0
*             相当于 >=0.0.0

~1.2.3        相当于 >=1.2.3 & <1.3.0
~0.2.3        相当于 >=0.2.3 & <0.3.0
~1.2          相当于 >=1.2.0 & <1.3.0 (等价于 1.2.x)
~0.2          相当于 >=0.2.0 & <0.3.0 (等价于 0.2.x)
~1            相当于 >=1.0.0 & <2.0.0 (等价于 1.x)
~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        相当于 >=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

API

所有方法都支持options对象,对象里所有属性的默认值都是false。

  • loose:对不太友善的semver字符串更宽容
  • includePrerelease:将prerelease版本当做普通版本处理

valid,parse,major,minor,patch,inc,prerelease上面都有,不赘述。常用gt,gte,lt,lte,eq,neq看名字就懂了。
cmp(v1, comparator, v2):自己传入比较操作符来比较
compare(v1, v2):相等返回0,v1大返回1,v2大返回-1
rcompare(v1, v2):compare的逆版本
diff(v1, v2):返回哪个版本不一致
intersects(r1, r2, loose):当两个范围有交集时,返回true

semver.gt('1.2.3', '9.8.7');           // false
semver.lt('1.2.3', '9.8.7');           // true
semver.cmp('1.2.3', '<', '9.8.7');     // true
semver.compare('1.2.3', '9.8.7');      // -1
semver.rcompare('1.2.3', '9.8.7');     // 1
semver.diff('1.2.3', '9.8.7');         // major
semver.intersects('1.2.3', '9.8.7');   // false

还有范围API:validRange,minVersion,satisfies,maxSatisfying,minSatisfying,gtr,ltr,outside,intersects和上面都大同小异,最常用的就是satisfies,因为范围未必是连续的,可能会有漏洞。例如1.2 <1.2.9 || >2.0.0这个范围,从1.2.9~2.0.0就是漏洞,所以用satisfies来判断版本是否在范围内。

clean(version):可以格式化字符串成版本号格式
coerce(version):可以强制将字符串转成SemVer对象

semver.clean('  =v1.2.3   ');                       // 1.2.3,忽略=v
semver.valid(semver.coerce('v2'));                  // 2.0.0
semver.valid(semver.coerce('42.6.7.9.3-alpha'));    // 42.6.7

发表评论

电子邮件地址不会被公开。 必填项已用*标注