为什么写了 "prepublish": "pnpm run build", 执行npm run publish 的之前不会触发呢?
这个问题的根本原因是 prepublish 脚本在 npm 4.0.0 之后已经被废弃了!
为什么 prepublish 不会触发?
从 npm 4.0.0 开始,prepublish 生命周期脚本被标记为废弃(deprecated),它不再可靠地在 npm publish 时触发。这是因为 prepublish 的行为存在歧义:
- 它会在
npm publish时触发 - 也会在
npm install时触发(当本地安装没有参数时)
这种双重触发机制导致了很多混乱和意外行为。
正确的解决方案
你应该使用以下两个脚本之一来替代 prepublish:
1. 使用 prepublishOnly(推荐)
{
"scripts": {
"prepublishOnly": "pnpm run build"
}
}
特点:
- ✅ 只在
npm publish时触发 - ✅ 不会在
npm install时触发 - ✅ 专门用于发布前的准备工作
2. 使用 prepare
{
"scripts": {
"prepare": "pnpm run build"
}
}
特点:
- ✅ 在
npm publish时触发 - ✅ 在
npm install时也会触发 - ✅ 适合需要在安装时也执行的构建步骤
生命周期脚本对比
| 脚本 | 触发时机 | 适用场景 |
|---|---|---|
prepublish |
❌ 已废弃 | 不推荐使用 |
prepublishOnly |
仅 npm publish |
发布前专用检查 |
prepare |
npm publish + npm install |
需要在安装时也构建 |
完整示例
{
"scripts": {
"build": "your-build-command",
"prepublishOnly": "pnpm run build",
"test": "your-test-command"
}
}
这样配置后,当你执行 npm publish 时,会自动先执行 pnpm run build,然后再发布包。
总结: 将 "prepublish" 改为 "prepublishOnly" 即可解决问题!

浙公网安备 33010602011771号