Lerna publish --canary版本检测异常及分支重建后问题求助
问题分析与解决方案
为什么重建前beta分支能正常识别预发布标签?
原beta分支的提交历史是独立演进且自带预发布标签链的:
- 每次从beta切功能分支,合并回beta时(无论是否保留分支结构),beta的
first-parent链是连续的,所有预发布标签都直接打在beta分支的提交节点上。git describe --first-parent会沿着这条链找到beta分支专属的最新预发布标签(比如2.1.0-beta.3),以此生成下一个预发布版本(2.1.0-beta.4)。 - 当beta合并到master后,master打的正式标签(比如
2.1.0)是在master的合并提交上,原beta分支的first-parent链并不包含这个master节点,但这完全不影响——Lerna在beta分支发布时,只会识别当前分支first-parent链上的标签,而beta自身的预发布标签都在这条链里,所以版本迭代正常。
重建后beta分支识别异常的核心原因
从master重建beta分支后,beta的提交历史完全继承自master的first-parent链:
- 如果重建操作发生在master发布
2.2.1之前,beta分支的提交历史里根本没有2.2.1对应的节点,git describe --first-parent只能找到master上更早的正式标签2.1.0,自然生成2.1.0-beta.1。 - 即便在
2.2.1发布后重建beta,由于2.2.1是master的正式标签,beta分支的first-parent链上没有专属的预发布标签,Lerna会误将master的正式标签作为基准,生成旧版本号的预发布版本。
解决办法
方法1:给beta分支打一个基准预发布标签
直接在当前beta分支的最新提交上,打一个与master正式版本匹配的预发布标签,让Lerna找到正确的基准:
# 切换到beta分支 git checkout beta # 打对应master正式版的预发布标签(master是2.2.1则打2.2.1-beta.0) git tag -a v2.2.1-beta.0 -m "Rebuild beta branch base tag" # 推送标签到远程仓库 git push origin v2.2.1-beta.0
之后执行lerna publish --preid beta,Lerna会基于2.2.1-beta.0生成2.2.1-beta.1。
方法2:合并master到beta分支对齐版本
将master的最新提交合并到beta分支,让beta的first-parent链包含master的2.2.1标签:
git checkout beta # 快进合并master(无冲突时用) git merge master --ff-only # 有冲突则直接合并并手动解决冲突 git merge master
合并完成后,git describe --first-parent会识别到2.2.1标签,执行lerna publish --preid beta就会生成2.2.1-beta.1。
方法3:修改Lerna的git describe参数(不推荐)
如果不想调整分支或标签,可以在lerna.json中移除--first-parent参数,让Lerna识别所有可达标签,但这可能导致其他分支的标签干扰版本判断:
{ "command": { "publish": { "gitDescribeArgs": "--long --always" } } }
内容的提问来源于stack exchange,提问作者Ron Smith
相关产品推荐
相关产品推荐

