问题描述

在使用 lerna 管理 monorepo 项目时,会使用 lerna publish 发包。lerna publish 内部会进行如下步骤:

  1. 先使用 lerna version 进行版本号变更;
  2. 将变更信息提交到 git 并增加 git tag;
  3. 使用 git push 推送 tag 信息;
  4. 使用 npm publish 发布包的新版本。

由于 lerna 先提交 git 再进行发布,在发布失败时,比如没有权限发包、npm 未登录等,会造成无法再次发包,因为lerna 会读取当前 git tag,并判断当前是否有内容变更。由于没有内容变更,lerna 不会变更版本号,但是当前版本号已在 git tag中存在,所以无法再次发包。

解决方法1: 删除 git commit 与 tag 信息

  1. 首先运行 git reset --hard HEAD~1 回退版本号变更;
  2. 删除本地 tag: git tag -d $(git log --date-order --tags --simplify-by-decoration --pretty=format:'%d' | head -1 | tr -d '()' | sed 's/,* tag://g')
  3. 删除远程 tag: 需要到远程仓库删除对应的tag 信息;
  4. 运行 git push -f 将本地变更推送到远程仓库。

然后便可以重新发包了。

解决方法2: 禁止 lerna 提交 git tag

查阅文档可知,git version 提供了 --no-git-tag-version 选项,可以禁止 lerna 将 package.json 的变动提交到 git,而是改为手动提交并推送到远程。 另外,也可以使用 --no-push 选项,允许 lerna 将变动提交到 git,但不往远程仓库推送。

两个选项使用方式如下:

lerna publish --no-git-tag-version
lerna publish --no-push

以上就是本文的全部内容了,感谢各位阅读,如果有任何疑问,欢迎电子邮件留言。

参考内容:

  • https://github.com/lerna/lerna/tree/main/commands/version
  • https://github.com/huruji/blog/issues/67