版本号可以划分为 主版本号.次版本号.修订号,类似这些: 3.14.10.42.02.7.18。 不同的情况对应不同的版本号增长:

  • 主版本号:新的版本不兼容老版本的 API
  • 次版本号:新的版本新增了部分功能,并向下兼容
  • 修订号:新的版本修复了部分bug,并向下兼容

开发者所说的“兼容”通常表示新的版本“向下兼容”次版本号修订号)。

版本范围

请在 package.json 文件里同时使用依赖名称和其版本范围来指明所需要的依赖:

你一定注意到了除版本号外的那些特殊字符。 这些字符有 >=<^~,它们是运算符,用来指定版本范围

版本范围的用处是标明依赖的哪个版本会在代码中起作用。

比较器

交集

用空格连接若干比较器可以创建 比较器集合。 最终版本范围是它包含的比较器的交集。 例如,比较器集合 >=2.0.0 <3.1.4 表示“大于或等于 2.0.0 小于 3.1.4

并集

完整的版本范围可以包含多个用 || 连接的比较器集合的并集。 如果并集的任何一边满足条件,整个版本范围就满足条件。 例如,版本范围 <2.0.0 || >3.1.4 意味着“小于 2.0.0 或者大于 ”

预发布标签

版本号也可以包含预发布标签(比如 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.5-beta.1版本 “大于或等于” (>=) <0>3.1.4-beta.2</0> 版本。

预发布版本通常包含一些不兼容的修改,而且通常你也不会愿意匹配到指定版本之外的预发布版本,所以上述匹配规则很有用。

版本范围进阶

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

字符 Xx 或者 * 都可以作为通配符,用于填充部分或全部版本号。

被省略的那部分版本号默认为 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 或者 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

版本号中缺少的部分将被 0 填充,且在匹配时这些位置允许改变。