得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

npm 更新包

包版本号组成

npm (Node Package Manager) 是一种应用于 JavaScript 编程语言的包管理器,也是 Node.js 的 JavaScript 运行时环境的默认包管理器

在一个项目中,其包依赖项列表保存在 package.json 文件中,每个已安装的包都被分配了一个版本号,一般由 3 部分组成:major.minor.patch

  1. major 表示非兼容的重大 API 改变(主要的)
  2. minor 表示向后兼容的功能性改变(次要的)
  3. patch 表示向后兼容的 bug 修正(修补的)

依赖包对应版本号前缀符号含义:

  1. * 匹配最新的 major 版本依赖包
  2. ^ 匹配最新的 minor 版本依赖包,eg: 1.1.0 可以更新匹配所有 1.x.x 的包,不会更新匹配 2.x.x
  3. ~ 匹配最新的 patch 版本依赖包,eg: 1.1.0 可以更新匹配所有 1.1.x 的包,不会更新匹配 1.2.x
  4. 没有前缀表示固定版本号, 版本不会更新匹配任何其他版本需要,手动修改 package.json 文件中的包版本

默认情况下,npm 会安装最新的版本,并在版本号前面附加一个 ^ 插入符号,如 ^15.2.0,有这种插入符号的依赖项意味着至少要安装 15.2.0;当存在一个更高的 minor 版本时,它就可能被使用,比方说当时有了个 15.6.2,就会在安装时升级到该版本

查看可更新的包

1
2
3
4
5
6
$ npm list -g --depth 0  # 查看全局安装的包
$ npm view package-name version # 查看安装包 package-name 最新发布的版本信息
$ npm view package-name versions # 查看远程安装包 package-name 的所有发布的版本信息
$ npm outdated # npm outdated [package-name]
Package Current Wanted Latest Location
npm-check-updates 16.14.20 17.1.11 17.1.11 node_modules/npm-check-updates

输出字段说明:

  1. Package 显示包名
  2. Current 当前包安装的版本
  3. Wanted 根据 package.json 包版本前缀规则可以更新的最新版本号
  4. Latest 是该包在仓库中标记为 latest 的版本
  5. Location 是该包在所居于的依赖树中所在的位置

Package 字段的字体颜色含义(上述代码片段中未正确显示):

  1. 红色:根据 package.json 中包版本前缀规则可更新的依赖包
  2. 黄色:根据 package.json 中包版本前缀规则不可更新的依赖包

升级包

以下述包版本变化为例,package.json 不做任何修改,查看 npm update 和 npm install 升级包时行为不同之处

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ npm ls --all
npm_package@ /home/test/npm_package
└─┬ micromatch@4.0.1 # 存在可更新版本 4.0.8
├─┬ braces@3.0.3
│ └─┬ fill-range@7.1.1
│ └─┬ to-regex-range@5.0.1
│ └── is-number@7.0.0
└── picomatch@2.3.1
$ cat package.json
{
"dependencies":
{
"micromatch": "^4.0.1"
}
}
$ npm outdated
Package Current Wanted Latest Location Depended by
micromatch 4.0.1 4.0.8 4.0.8 node_modules/micromatch npm_package

npm update

  1. 更新符合 package.json 允许版本的包:如本例中 package.json 中的版本号是 ^4.0.1,运行 npm update 会更新到 4.x.x 范围内的最新版本(例如 4.0.8),但不会跳到 5.x.x
    1
    2
    3
    $ npm ls
    npm_package@ /home/lingxing/Workspace/test/npm_package
    └── micromatch@4.0.8
  2. 不会修改 package.json 中的版本号
    1
    2
    3
    4
    5
    6
    7
    $ cat package.json
    {
    "dependencies":
    {
    "micromatch": "^4.0.1"
    }
    }
  3. 会更新 package-lock.json 中的具体依赖版本,使其与新安装的版本一致

npm install

  1. 更新符合 package.json 允许版本的包:如本例中 package.json 中的版本号是 ^4.0.1,运行 npm install 不会更新
    1
    2
    3
    $ npm ls
    npm_package@ /home/lingxing/Workspace/test/npm_package
    └── micromatch@4.0.1
  2. 不会修改 package.json 中的版本号
    1
    2
    3
    4
    5
    6
    7
    $ cat package.json
    {
    "dependencies":
    {
    "micromatch": "^4.0.1"
    }
    }
  3. 不会更新 package-lock.json 中的具体依赖版本

那如果要修改 package.json 升级呢?

be slow to promise and quick to perform.