[wip]lerna 使用记录

管理 NPM 包,自动发布、生成发布日志的工具。配合 MonoRepo 使用最佳。
 
 
 
 
 
 
 
这真是让人崩溃的一次使用过程,中间发生了很多问题。前后花费了我整整两天来排查。
问题:每一次内容变更都会导致 learn 发布所有包,尽管包内容并没有发生变更。发现在本地能够正确识别变更,但是在CI环境下不能。通过比较本地运行和CI运行日志,发现些许不同:
lerna notice cli v8.0.2 lerna info versioning independent lerna info ci enabled lerna info Assuming all packages changed Changes: - @pagenote/bridge: 1.0.8-next.0 => 1.0.8-next.1 - @pagenote/obsidian: 0.1.20-next.0 => 0.1.20-next.1 - @pagenote/shared: 1.14.29-next.0 => 1.14.29-next.1
本地运行时是没有红色这段提示的。网络搜索了很久很久都没有找到答案。估计全网遇到这个问题的也不多了。
原因:最后研究了 lerna 是如何比较差异的原理后,才找到原因:lerna 是通过 git tag 来进行差异化比较的,而在 GitHub Action 中,当通过 push、change、merge 等触发的流水线,运行 actions/checkout@v4 检出代码时,默认是不会拉取 tag 信息的,所以导致 learn 在比较差异时,无法找到比较版本,所以无论任何commit 都会被视为第一个版本,一定会用于 publish 使用。
修复:找到根源后,在执行 checkout 时指定,检出拉取tag 信息
- name: Checkout Repository uses: actions/checkout@v4 with: fetch-depth: 0 fetch-tags: true
 
后记:这个问题前后折磨了我两天的时间,几乎是茶饭不思,日夜兼程的解决这个问题。有趣的是:
  1. 我在公司前两天工作也遇到了几乎一摸一样的问题:在 gitlab 的 CI 中,自动修复代码格式后,自动提交。gitlab 触发时是以 commit 节点拉取代码,而不含分支信息。导致在 git push 时候,无法推送代码。
  1. 三天后的某一天,我又遇到了这个问题。竟然想了好久好久,都不记得当时怎么解决了。于是又重新一个一个的翻了之前的提交代码。
所以记录还是很有用的,赶紧写下这篇文章。