为什么写了 "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" 即可解决问题!

posted @ 2026-04-01 20:02  龙陌  阅读(2)  评论(0)    收藏  举报