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

如何实现npm工作区包的事务性发布及版本回滚?

问题

我维护一个包含多个包的monorepo工作区,平时用以下命令批量更新并发布所有包:

npm publish --workspace packages

这个命令会按顺序发布包,一旦某个包发布失败,后续包都会被跳过。比如从v1.0.0升级到v1.0.1时,如果package3发布失败,就会出现版本不一致的情况:

package1 1.0.0 -> 1.0.1
package2 1.0.0 -> 1.0.1
package3 1.0.0 -> FAILED
package4 1.0.0 -> SKIPPED
package5 1.0.0 -> SKIPPED

我希望所有包始终保持版本一致,但当前行为会导致版本混乱。想请教:

  1. 有没有办法在发布失败时回滚已成功发布的前置包版本?
  2. 如果没有,能否配置成事务性发布——所有包发布成功才生效,否则全部失败?

解答

回滚已发布包的可能性

目前npm publish没有原生支持发布失败后的自动回滚机制。npm包仓库的特性决定了,已成功发布的版本一旦推送到仓库,无法直接撤回(仅能在发布后72小时内删除未被其他包依赖的版本,但这不是可靠的回滚方案,还可能影响已安装该版本的用户)。所以无法自动回滚已成功发布的前置包版本。

事务性发布的支持情况

当前npm publish --workspace不支持事务性发布。你已经提交了事务性发布的相关提案,这是针对monorepo批量发布痛点的合理改进方向,可以持续关注提案的推进进度。

临时替代方案

若要保证所有包版本一致,可以尝试以下两种方式:

  • 预发布全量验证:发布前对所有包做完整检查——执行npm pack生成每个包的压缩包,确认包内文件完整;运行全量测试用例,确保所有包功能正常;提前排查可能导致发布失败的问题,比如依赖缺失、权限不足等。
  • 分阶段手动管控:先使用npm version批量更新所有包的本地版本到目标值,此时仅修改本地版本文件,不发布到仓库;接着执行批量发布命令,若中途出现失败,手动登录npm仓库删除已发布的新版本,再将本地所有包的版本回滚到发布前的状态,重新准备发布流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:33:23