如何实现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
我希望所有包始终保持版本一致,但当前行为会导致版本混乱。想请教:
- 有没有办法在发布失败时回滚已成功发布的前置包版本?
- 如果没有,能否配置成事务性发布——所有包发布成功才生效,否则全部失败?
解答
回滚已发布包的可能性
目前npm publish没有原生支持发布失败后的自动回滚机制。npm包仓库的特性决定了,已成功发布的版本一旦推送到仓库,无法直接撤回(仅能在发布后72小时内删除未被其他包依赖的版本,但这不是可靠的回滚方案,还可能影响已安装该版本的用户)。所以无法自动回滚已成功发布的前置包版本。
事务性发布的支持情况
当前npm publish --workspace不支持事务性发布。你已经提交了事务性发布的相关提案,这是针对monorepo批量发布痛点的合理改进方向,可以持续关注提案的推进进度。
临时替代方案
若要保证所有包版本一致,可以尝试以下两种方式:
- 预发布全量验证:发布前对所有包做完整检查——执行
npm pack生成每个包的压缩包,确认包内文件完整;运行全量测试用例,确保所有包功能正常;提前排查可能导致发布失败的问题,比如依赖缺失、权限不足等。 - 分阶段手动管控:先使用
npm version批量更新所有包的本地版本到目标值,此时仅修改本地版本文件,不发布到仓库;接着执行批量发布命令,若中途出现失败,手动登录npm仓库删除已发布的新版本,再将本地所有包的版本回滚到发布前的状态,重新准备发布流程。
内容的提问来源于stack exchange,提问作者vighnesh153
相关产品推荐
相关产品推荐

