Jiahonzheng's Blog

package.json 中 ^ 与 ~ 的区别

字数统计: 435阅读时长: 1 min
2018/02/21 Share

我们知道 package.json 描述了项目的各种包的依赖关系。在大多情况下,在包版本号前,会有一个符号,有的是插入符号 ^ (caret),有的是波浪符号~ (tilde):

1
2
3
4
5

"dependencies": {
"bluebird": "^3.5.1",
"body-parser": "~1.18.2",
}

本文,大致总结了二者间的区别。

版本知识

版本号由三部分构成: MAJORMINORPATCH

例如, 3.5.1 对应的是 MAJOR = 3 MINOR = 5 PATCH = 1

MAJOR: 若该版本号变化,则表示有一个不可和上一版本兼容的大更改。

MINOR: 若该版本号变化,则表示增加新功能,且该版本可向后兼容。

PATCH: 若该版本号变化,则表示若干错误被修复,且该版本可向后兼容

^~ 的区别

插入符号 ^

在此情况下, npm 会更新到 MAJOR 中的最新版本。在本文开头的 package.json 片段中,即 npm 在安装 bluebird 时,会匹配到 3.x.x 的最新版本,但不会匹配到 4.0.0

波浪符号 ~

在此情况下, npm 会更新到 MINOR 中的最新版本。在本文开头的 package.json 片段中,即 npm 在安装 body-parser 时,会匹配到 1.18.x 的最新版本,但不会匹配到 1.19.0

冷知识

但我们使用 npm 安装依赖时,会优先考虑使用插入符号 ^ 而不是波浪符号 ~ 去匹配依赖的版本。

由于 MAJOR 的变化意味着可能会影响之前版本的兼容性,故 npm 无论是使用插入符号还是波浪符号,都不会去自动修改 MAJOR

总结

^3.5.1 : 3.5.1 <= 匹配版本 < 4.0.0

~1.18.2 : 1.18.2 <= 匹配版本 < 1.19.0

CATALOG
  1. 1. 版本知识
  2. 2. ^ 与 ~ 的区别
    1. 2.1. 插入符号 ^
    2. 2.2. 波浪符号 ~
  3. 3. 冷知识
  4. 4. 总结