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脚本会在发布前运行,但最终发布的包仍是旧版本,时间线如下:
- 当前
package.json的version为"0.0.10" - 执行
npm publish - 触发
prepublishOnly脚本,依次运行npm run release && npm run build commit-and-tag-version正确更新了package.json、package-lock.json的版本,并打上v0.0.11标签vite build完成打包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" } }
原理:
- 首次执行
npm publish时,触发prepublishOnly脚本,完成版本更新和打包 - 调用
npm publish --no-prepublish-only,该命令会跳过prepublishOnly钩子,直接使用更新后的package.json版本发布 - 执行
exit 1终止首次发布流程,避免重复发布
这样你只需要正常执行npm publish,就能自动完成版本更新、打包和正确版本的发布。
内容的提问来源于stack exchange,提问作者Jordi Nebot
相关产品推荐
相关产品推荐

