NPM semver
本业功能介绍
npm 的语义版本控制程序
安装
npm install --save semver
用法
作为节点模块:
const semver = require('semver')
semver.valid('1.2.3') // '1.2.3'
semver.valid('a.b.c') // null
semver.clean(' =v1.2.3 ') // '1.2.3'
semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
semver.gt('1.2.3', '9.8.7') // false
semver.lt('1.2.3', '9.8.7') // true
semver.valid(semver.coerce('v2')) // '2.0.0'
semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
作为命令行实用程序:
$ semver -h
A JavaScript implementation of the http://semver.org/ specification
Copyright Isaac Z. Schlueter
Usage: semver [options] <version> [<version> [...]]
Prints valid versions sorted by SemVer precedence
Options:
-r --range <range>
Print versions that match the specified range.
-i --increment [<level>]
Increment a version by the specified level. Level can
be one of: major, minor, patch, premajor, preminor,
prepatch, or prerelease. Default level is 'patch'.
Only one version may be specified.
--preid <identifier>
Identifier to be used to prefix premajor, preminor,
prepatch or prerelease version increments.
-l --loose
Interpret versions and ranges loosely
-p --include-prerelease
Always include prerelease versions in range matching
-c --coerce
Coerce a string into SemVer if possible
(does not imply --loose)
Program exits successfully if any valid version satisfies
all supplied ranges, and prints all satisfying versions.
If no satisfying versions are found, then exits failure.
Versions are printed in ascending order, so supplying
multiple versions to the utility will just sort them.
版本
http://semver.org/ 上的 v2.0.0 规范 描述了“版本” 。
开头"=“或"v"字符被剥离并被忽略。
范围
A version range 是一组 comparators 指定满足该范围的版本。
A comparator 由 operator 和组成 version。原语集 operators 是:
- < 少于
- <= 小于或等于
-
比
...
更棒 >=
大于或等于- =等于。如果未指定任何运算符,则假定相等,因此该运算符是可选的,但可以包括在内。
例如,比较器>=1.2.7
将匹配的版本1.2.7
,1.2.8
,2.5.3
,和1.3.9
,但不是版本1.2.6
或 1.1.0。
比较器可以通过空格连接起来,形成一个 comparator set,由它包括的所有比较器的交集满足。
一个范围由一个或多个比较器集组成,并由组成||。当且仅当||版本分隔的至少一个分隔的比较器集中的每个比较器都满足时,版本才与范围匹配。
例如,范围>=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
。
预发行标签
如果某个版本具有预发布标签(例如 1.2.3-alpha.3),则只有在至少一个具有相同[major, minor, patch]元组的比较器也具有预发布标签的情况下,才允许它满足比较器集。
例如,>1.2.3-alpha.3
允许范围与版本匹配 1.2.3-alpha.7,但是根据 SemVer 排序规则,即使从技术上讲“大于” ,该范围也不会被满足 。版本范围仅接受版本上的预发行标签。该版本将满足该范围,因为它没有预发布标志,并且大于。3.4.5-alpha.93.4.5-alpha.91.2.3-alpha.31.2.33.4.5 3.4.51.2.3-alpha.7
此行为的目的是双重的。首先,预发行版本经常被非常快速地更新,并且包含许多重大更改,这些更改(根据作者的设计)尚不适合公众使用。因此,默认情况下,它们从范围匹配语义中排除。
其次,选择使用预发行版本的用户清楚地表明了使用该特定的 alpha / beta / rc 版本集的意图。通过在该范围中包含预发布标签,用户表示他们已经意识到风险。但是,仍然不适合假定他们选择对下一组预发行版本承担类似的风险。
发行前标识符
该方法.inc 采用一个附加的 identifier 字符串参数,该参数会将字符串的值附加为预发行标识符:
semver.inc('1.2.3', 'prerelease', 'beta')
// '1.2.4-beta.0'
命令行示例:
$ semver 1.2.3 -i prerelease --preid beta
1.2.4-beta.0
然后可以用来进一步增加:
$ semver 1.2.4-beta.0 -i prerelease
1.2.4-beta.1
高级范围语法
高级范围语法以确定性方式降低了原始比较器的负担。
可以使用空格或来以与原始比较器相同的方式组合高级范围||。
连字符范围 XYZ- ABC
指定一个包含集合。
-
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 或*可被用来“站在”在数字值中的一个[major, minor, patch]元组。
- *:= >=0.0.0(任何版本都可以满足)
- 1.x:= >=1.0.0 <2.0.0(匹配主要版本)
- 1.2.x:= >=1.2.0 <1.3.0(匹配主要版本和次要版本)
部分版本范围被视为 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 0.2.5 ^ 0.0.4
允许所做的更改不会修改[major, minor, patch]元组中最左边的非零数字 。换句话说,这允许版本的补丁和次要更新 1.0.0 及以上,对版本补丁更新 0.X >=0.1.0,并没有对版本的更新 0.0.X。
许多作者将 0.x 版本视为 x 主要的“重大更改”指标。
当作者可能在发行 0.2.4 和 0.3.0 发行之间进行重大更改时,插入号范围是理想的,这是常见的做法。但是,假设和之间不会有重大变化 。根据通常观察到的做法,它允许假定为可加性(但不间断)的更改。0.2.40.2.5
解析插入符号范围时,缺失 patch 值会使数字减半 0,但即使主要版本和次要版本均为,也可以在该值内保持灵活性 0。
- ^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
缺少 minor 和 patch 值将减糖为零,但即使主版本为零,也允许这些值具有灵活性。
- ^1.x := >=1.0.0 <2.0.0
- ^0.x := >=0.0.0 <1.0.0
范围语法
将所有这些放在一起,下面是范围的 Backus-Naur 语法,以供分析器作者使用:
range-set ::= range ( logical-or range ) *
logical-or ::= ( ' ' ) * '||' ( ' ' ) *
range ::= hyphen | simple ( ' ' simple ) * | ''
hyphen ::= partial ' - ' partial
simple ::= primitive | partial | tilde | caret
primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
xr ::= 'x' | 'X' | '*' | nr
nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
tilde ::= '~' partial
caret ::= '^' partial
qualifier ::= ( '-' pre )? ( '+' build )?
pre ::= parts
build ::= parts
parts ::= part ( '.' part ) *
part ::= nr | [-0-9A-Za-z]+
功能
所有方法和类都带有最终 options 对象参数。false 默认情况下,此对象中的所有选项都是。支持的选项有:
- loose 更宽容关于不是相当有效的 semver 字符串。(当然,任何结果输出都将始终是 100%严格兼容的。)出于向后兼容的原因,如果 options 参数是布尔值而不是对象,则将其解释为 loose 参数。
- includePrerelease 设置为禁止默认行为,除非从范围中排除了预发行版本,否则除非明确选择加入。
严格模式比较器和范围将严格限制其解析的 SemVer 字符串。
- valid(v):返回已解析的版本,如果无效,则返回 null。
- inc(v, release):回到依释放型(递增的版本 major, premajor,minor,preminor,patch, prepatch,或 prerelease)或 null 如果它是无效的 _ premajor 在一次呼叫中,该版本将升至下一个主要版本,然后降至该主要版本的预发行版本。 preminor,并 prepatch 以相同的方式工作。 _ 如果从非预发行版本调用,prerelease 则的工作方式与相同 prepatch。它会增加补丁程序版本,然后进行预发行。如果输入版本已经是预发行版,则只需对其增加即可。
- prerelease(v):返回预发布组件的数组;如果不存在,则返回 null。例:prerelease(‘1.2.3-alpha.1’) -> [‘alpha’, 1]
- major(v):返回主要版本号。
- minor(v):返回次要版本号。
- patch(v):返回补丁程序版本号。
- intersects(r1, r2, loose):如果两个提供的范围或比较器相交,则返回 true。
比较
- gt(v1, v2): v1 > v2
- gte(v1, v2): v1 >= v2
- lt(v1, v2): v1 < v2
- lte(v1, v2): v1 <= v2
- eq(v1, v2):v1 == v2 即使它们在逻辑上是等效的,即使它们不是完全相同的字符串也是如此。您已经知道如何比较字符串。
- neq(v1, v2):v1 != v2 的反面 eq。
- cmp(v1, comparator, v2):传入一个比较字符串,它将调用上面的相应函数。 “===“并”!==“进行简单的字符串比较,但出于完整性考虑,将其包括在内。如果提供了无效的比较字符串,则抛出该异常。
- compare(v1, v2):返回 0 如果 v1 == v2,或 1 如果 v1 是更大的,或者-1 如果 v2 是更大的。如果传递给,则升序排序 Array.sort()。
- rcompare(v1, v2):比较的反向。传递给时,以降序对版本数组进行排序 Array.sort()。
- diff(v1, v2):由释放类型返回两个版本之间的差异(major,premajor,minor,preminor,patch,prepatch,或 prerelease),或者为 null 如果版本是相同的。
比较器
- intersects(comparator):如果比较器相交,则返回 true
范围
- validRange(range):返回有效范围;如果无效,则返回 null
- satisfies(version, range):如果版本满足范围,则返回 true。
- maxSatisfying(versions, range):返回满足范围的列表中的最高版本,null 如果没有,则返回最高版本。
- minSatisfying(versions, range):返回满足范围的列表中的最低版本,或者 null 如果都不满足。
- gtr(version, range):true 如果版本大于该范围内所有可能的版本,则返回。
- ltr(version, range):true 如果版本小于该范围内所有可能的版本,则返回。
- outside(version, range, hilo):如果版本在上下方向超出范围的边界,则返回 true。该 hilo 参数必须是字符串’>‘或’<’。(这是由调用的函数 gtr 和 ltr)。
- intersects(range):如果任何范围比较器相交,则返回 true
如果您想知道某个版本是否满足或不满足范围,请使用该 satisfies(version, range)功能。
强制
- coerce(version):如果可能,将字符串强制为 semver
这旨在为非 semver 字符串提供非常宽容的转换。它看起来在字符串的第一个数字,并且消耗所有剩余的字符满足至少一个局部 semver(例如 1,1.2,1.2.3)直到最大允许长度(256 个字符)。较长的版本只是被截断了(4.6.3.9.2-alpha2 变为 4.6.3)。所有周围的文本都将被忽略(v3.4 replaces v3.3.1 成为 3.4.0)。仅缺少数字的文本将无法强制转换(version one 无效)。考虑强制转换的任何 semver 组件的最大长度为 16 个字符;更长的组件将被忽略(10000000000000000.4.7.4 变为 4.7.4)。任何 semver 分量的最大值为 Integer.MAX_SAFE_INTEGER || (2\*\*53 - 1)
; 较高值的组件无效(9999999999999999.4.7.4 可能无效)
。