发布于 2 周前 ,更新于 2 周前 npm

NPM preinstall 不同版本的差异

preinstall 从字面意思理解是在 install 之前执行。但到了 NPM 7.0 版本以后就有所不同。

我的项目使用的是 pnpm 包管理器,但在 pnpm install 之前需要执行脚本来处理 package.json 文件,所以用到了 preinstall 脚本,但 preinstall 执行的时机跟预想的不一样: preinstall 实际上是在 install 之后执行的(即安装完依赖之后执行的)。在 pnpm 的 GitHub 里面找到了相似问题的 Issue ,从这里找到了答案,原来是 NPM 的问题。

先写个 Demo 测试一下:

package.json

{
  "name": "test",
  "scripts": {
    "preinstall": "node ./preinstallTest.js"
  },
  "dependencies": {
    "axios": "^0.24.0"
  }
}

preinstallTest.js

console.log('preinstall')
NPM 7.0 以下版本

执行 npm install 输出结果顺序:

  1. preinstall
  2. 安装 axios

与预期一致。

NPM 7.0+ 版本

执行 npm install 输出结果顺序:

  1. 安装 axios
  2. preinstall
Yarn 1.x 版本

执行 npm install 输出结果顺序:

  1. preinstall
  2. 安装 axios

与预期一致。

Pnpm

pnpm 不知道是从哪个版本开始也跟 NPM 7.0+ 一样。但在 pnpm 6.21 版本开始新增了 pnpm:devPreinstall 脚本,所以将 preinstall 换成 pnpm:devPreinstall 即可达到 NPM 7.0 以下版本的效果。

似乎 NPM 正打算将 preinstall 还原到 6.0 版本的效果,具体可查看 https://github.com/npm/cli/issues/2660

© 2016 - 2021 BY 禾惠 粤ICP备20027042号