semver
semver
npm的语义版本
安装
npm install --save semver
用法
作为节点模块:
作为命令行实用程序:
$ semver -h
SemVer 5.3.0
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
-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
由a operator
和a 组成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 ','预发布',' beta ') // '1.2.4-beta.0'
命令行示例:
$ semver 1.2.3 -i prerelease --preid beta1.2.4-beta.0
然后可以用来进一步增加:
$ semver 1.2.4-beta.0 -i预发布1.2.4-beta.1
高级范围语法
高级范围语法以确定的方式去处理原始比较器。
高级范围可以与使用空格或原始比较器的方式组合||
。
连字符范围 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
X-范围 1.2.x 1.X 1.2.* *
任何的X
,x
或*
可被用来“站在”在数字值中的一个[major, minor, patch]
元组。
- *:= >=0.0.0(任何版本满足)
部分版本范围被视为X范围,因此特殊字符实际上是可选的。
- ""(空字符串):= *:=>=0.0.0
蒂尔德山脉 ~1.2.3 ~1.2 ~1
如果在比较器上指定了次要版本,则允许修补程序级更改。如果没有,则允许小级更改。
- ~1.2.3:= >=1.2.3 <1.(2+1).0:=>=1.2.3 <1.3.0
Caret Ranges ^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
- ^1.2.3 := >=1.2.3 <2.0.0
解析插入符号范围时,缺失patch
值会消耗该数字0
,但允许该值内的灵活性,即使主要版本和次要版本都是0
。
- ^1.2.x := >=1.2.0 <2.0.0
缺失minor
和patch
值将变为零,但也允许这些值内的灵活性,即使主要版本为零。
- ^1.x := >=1.0.0 <2.0.0
范围语法
把所有这些放在一起,这是一个针对范围的Backus-Naur语法,为了解析器作者的利益:
功能
所有方法和类都采用最终的loose
布尔参数,如果为真,则会对不完全有效的 semver 字符串更宽容。当然,结果输出总是100%严格。
严格模式比较器和范围将严格关于它们解析的 SemVer 字符串。
valid(v)
:返回解析后的版本,如果无效,则返回 null。
对照
- gt(v1, v2): v1 > v2
比较
intersects(comparator)
:如果比较器相交,则返回 true
范围
validRange(range)
:返回有效范围,如果无效,则返回 null
请注意,由于范围可能是非连续的,因此版本可能不会大于范围,小于范围或满足范围!例如,范围1.2 <1.2.9 || >2.0.0将有一个1.2.9 直到2.0.0,因此版本1.2.10不会大于范围(因为2.0.1满足,更高),也不会小于范围(因为1.2.8满足,这是更低),它也不会满足范围。
如果您想知道版本是否满足或不满足范围,请使用该satisfies(version, range)
功能。
强迫
coerce(version)
:如果可能,将字符串强制转换为semver
这旨在为非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
无效)。考虑强制的任何半成分的最大长度为1
6个字符; 较长的组件将被忽略(10000000000000000.4.7.4
变为4.7.4
)。任何 semver 组件的最大值是Integer.MAX_SAFE_INTEGER || (2**53 - 1
较高价值的组件无效(9999999999999999.4.7.4可能
无效)。