依赖的版本

语义化版本

Yarn 里的包遵守 语义化版本,也叫 “semver”。 当你从资源库安装一个新包,它会和语义版本范围一起被添加到你的 package.json

这些版本被分解成 主版本号.次版本号.修订号,看起来像其中之一︰ 3.14.10.42.02.7.18。 不同时期递增版本的不同部分:

  • 主版本号:当你做了不兼容的 API 修改
  • 次版本号:当你做了向下兼容的功能性新增
  • 修订号:当你做了向下兼容问题修正

注意: 先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

当开发者说两个语义版本一个“兼容”另一个,它们叫做向后兼容的修改 (minorpatch)。

版本范围

当你想指定一个依赖,在 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.23.1.4-beta.12,但不会匹配 3.1.5-beta.1,即使它技术上说 “大于或等于” (>=) 3.1.4-beta.2 版本。

预发布版往往包含附带的破坏性修改,通常你不会想匹配你指定版本之外的预发布版,所以这个行为是有用的。

高级版本范围

连字符范围

连字符范围 (例如 2.0.0-3.1.4) 指定一个包含集合。如果版本缺少一部分(例如 0.42),它们会用零填充。

版本范围 扩展的版本范围
2.0.0 - 3.1.4 >=2.0.0 <=3.1.4
0.4 - 2 >=0.4.0 <=2.0.0
X 范围

任何 Xx 或者 * 都可以用于省略部分或全部未指定版本。

版本范围 扩展的版本范围
* >=0.0.0 (任意版本)
2.x >=2.0.0 <3.0.0 (匹配主要版本)
3.1.x > = 3.1.0 < 3.2.0(匹配主要和次要版本)

如果版本的一部分被省略,它被假定为 x 范围。

版本范围 扩展的版本范围
`` (空字符串) *> = 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.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

更多资源