语义化版本
Yarn 里的包遵守 语义化版本,也叫 “semver”。 当你从资源库安装一个新包,它会和语义版本范围一起被添加到你的 package.json
。
版本号可以划分为 主版本号.次版本号.修订号
,类似这些: 3.14.1
、 0.42.0
、 2.7.18
。 不同的情况对应不同的版本号增长:
主版本号
:新的版本不兼容老版本的 API次版本号
:新的版本新增了部分功能,并向下兼容修订号
:新的版本修复了部分bug,并向下兼容
注意: 有时语义版本也会包含一些“标签”或者“扩展”,用于标记预发布版本或者测试版本,比如2.0.0-beta.3
。
开发者所说的“兼容”通常表示新的版本“向下兼容”(次版本号
和修订号
)。
版本范围
请在 package.json
文件里同时使用依赖名称和其版本范围来指明所需要的依赖:
{
"dependencies": {
"package-1": ">=2.0.0 <3.1.4",
"package-2": "^0.4.2",
"package-3": "~2.7.1"
}
}
你一定注意到了除版本号外的那些特殊字符。 这些字符有 >=
,<
,^
和~
,它们是运算符,用来指定版本范围。
版本范围的用处是标明依赖的哪个版本会在代码中起作用。
比较器
每个版本范围组成 比较器。这些比较器是简单 运算符 后面跟着一个 版本号。以下是一些基本的运算符:
比较器 | 描述 |
---|---|
<2.0.0 |
任何小于 2.0.0 的版本 |
<=3.1.4 |
任何小于或等于 3.1.4 的版本 |
>0.4.2 |
任何大于 0.4.2 的版本 |
>=2.7.1 |
任何大于或等于 2.7.1 的版本 |
=4.6.6 |
任何等于 4.6.6 的版本 |
注意:如果没有明确指定运算符,那么版本范围默认为=
,也就是说=
是可选的。
交集
用空格连接若干比较器可以创建 比较器集合。 最终版本范围是它包含的比较器的交集。 例如,比较器集合 >=2.0.0 <3.1.4
表示“大于或等于 2.0.0
并小于 3.1.4
”。
并集
完整的版本范围可以包含多个用 ||
连接的比较器集合的并集。 如果并集的任何一边满足条件,整个版本范围就满足条件。 例如,版本范围 <2.0.0 || >3.1.4
意味着“小于 2.0.0
或者大于 3.1.4
”。
预发布标签
版本号也可以包含预发布标签(比如 3.1.4-beta.2
)。 如果一个比较器包含有预发布标签的版本,它将只匹配有相同 major.minor.patch
的版本。
例如,版本范围 >=3.1.4-beta.2
将匹配 3.1.4-beta.2
或 3.1.4-beta.12
,但不会匹配 3.1.5-beta.1
,即使在理论上 3.1.5-beta.1
版本 “大于或等于” (>=
) <0>3.1.4-beta.2</0> 版本。
预发布版本通常包含一些不兼容的修改,而且通常你也不会愿意匹配到指定版本之外的预发布版本,所以上述匹配规则很有用。
版本范围进阶
连字符范围
连字符范围(例如 2.0.0 - 3.1.4
)标明了一个包含集合。数字 0 会被用来填充版本号中缺少的那些部分(例如 0.4
或 2
)。
版本范围 | 扩展的版本范围 |
---|---|
2.0.0 - 3.1.4 |
>=2.0.0 <=3.1.4 |
0.4 - 2 |
>=0.4.0 <=2.0.0 |
X 范围
字符 X
、x
或者 *
都可以作为通配符,用于填充部分或全部版本号。
版本范围 | 扩展的版本范围 |
---|---|
* |
>=0.0.0 (任意版本) |
2.x |
>=2.0.0 <3.0.0 (匹配主要版本) |
3.1.x |
> = 3.1.0 < 3.2.0 (匹配主要和次要版本) |
被省略的那部分版本号默认为 x 范围。
版本范围 | 扩展的版本范围 |
---|---|
`` (empty string) | * 或 > = 0.0.0 |
2 |
2.x.x 或 > = 2.0.0 < 3.0.0 |
3.1 |
3.1.x 或 > = 3.1.0 < 3.2.0 |
~ 字符范围
同时使用字符 ~
和次版本号,表明允许修订号
变更。同时使用字符 ~
和主版本号,表明允许次版本号
变更。
版本范围 | 扩展的版本范围 |
---|---|
~3.1.4 |
>=3.1.4 <3.2.0 |
~3.1 |
3.1.x 或 > = 3.1.0 < 3.2.0 |
~3 |
3.x 或 > = 3.0.0 < 4.0.0 |
注意︰在波浪号范围中指定预发布版本将只匹配和它完整版本号相同的预发布版本。 例如,版本范围~3.1.4-beta.2
会匹配3.1.4-beta.4
但不匹配3.1.5-beta.2
,因为major.minor.patch
版本不同。
^ 字符范围
字符 ^ 表明不会修改版本号中的第一个非零数字,3.1.4
里的 3
或者 0.4.2
里的 4
。
版本范围 | 扩展的版本范围 |
---|---|
^3.1.4 |
>=3.1.4 <4.0.0 |
^0.4.2 |
>=0.4.2 <0.5.0 |
^0.0.2 |
>=0.0.2 <0.0.3 |
注意︰yarn add [package-name]
命令默认使用 ^ 范围。
版本号中缺少的部分将被 0 填充,且在匹配时这些位置允许改变。
版本范围 | 扩展的版本范围 |
---|---|
^0.0.x |
>=0.0.0 <0.1.0 |
^0.0 |
>=0.0.0 <0.1.0 |
^0.x |
>=0.0.0 <1.0.0 |
^0 |
>=0.0.0 <1.0.0 |
更多信息
- 语义版本系统的完整规范:
node-semver
README。 - 用真实的包测试语义版本:npm semver calculator。