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
输出结果顺序:
- preinstall
- 安装 axios
与预期一致。
NPM 7.0+ 版本
执行 npm install
输出结果顺序:
- 安装 axios
- preinstall
Yarn 1.x 版本
执行 npm install
输出结果顺序:
- preinstall
- 安装 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