You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

npm publish未读取prepublishOnly中更新的版本问题咨询

npm publish 使用 prepublishOnly 时忽略版本更新的问题

问题描述

我正在搭建一个要发布到私有npm仓库的库,配置了如下scripts:

{
  "scripts": {
    "build": "tsc --p ./tsconfig-build.json && vite build",
    "release": "commit-and-tag-version --no-verify",
    "prepublishOnly": "npm run release && npm run build"
  }
}

执行npm publish时,尽管release脚本会在发布前运行,但最终发布的包仍是旧版本,时间线如下:

  1. 当前package.json的version为"0.0.10"
  2. 执行npm publish
  3. 触发prepublishOnly脚本,依次运行npm run release && npm run build
  4. commit-and-tag-version正确更新了package.json、package-lock.json的版本,并打上v0.0.11标签
  5. vite build完成打包
  6. publish却发布了my-library@0.0.10,完全忽略了prepublishOnly中更新的版本

手动执行npm run release && npm run build && npm publish则一切正常。请问这是prepublishOnly的预期行为吗?有没有办法在不使用自定义发布脚本的前提下解决该问题?


解答

这是npm的预期行为

npm在执行publish命令的初始化阶段就会读取并缓存package.json的所有内容(包括version字段),之后即使prepublishOnly脚本修改了package.json,npm的发布流程也不会重新读取这个文件,只会使用最初缓存的旧版本号发布。而手动执行命令时,npm publish是在版本更新完成后才启动的,因此它读取的是更新后的package.json,所以能正常发布新版本。

无需自定义发布脚本的解决方案

可以通过在prepublishOnly脚本中更新版本后,重新触发一次跳过prepublishOnly的发布命令,同时终止原发布流程来解决:

修改package.json的scripts:

{
  "scripts": {
    "build": "tsc --p ./tsconfig-build.json && vite build",
    "release": "commit-and-tag-version --no-verify",
    "prepublishOnly": "npm run release && npm run build && npm publish --no-prepublish-only && exit 1"
  }
}

原理:

  1. 首次执行npm publish时,触发prepublishOnly脚本,完成版本更新和打包
  2. 调用npm publish --no-prepublish-only,该命令会跳过prepublishOnly钩子,直接使用更新后的package.json版本发布
  3. 执行exit 1终止首次发布流程,避免重复发布

这样你只需要正常执行npm publish,就能自动完成版本更新、打包和正确版本的发布。


内容的提问来源于stack exchange,提问作者Jordi Nebot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:50:58