文/修名
记录一下lerna publish原理,避免以后踩坑:lerna 官网
lerna publish
查找变更逻辑
从上面这个图可以看到其中会有一些坑:
坑1:分支3的情况,因为开发者自己打的一些标签会影响lerna查找变更,可能会造成一些变更的包没有发布
解决办法:
1. 尽量避免自己打Tag
2. 或者只在一个专门的分支上,例如master,专门运行lerna publish进行发布,这个分支不能自己打其他Tag
坑2:几条分支同时进行的情况,可能生成了相同的版本号,从而发生版本冲突
解决办法:
1. 分支开发者之间约定好各自版本号
2. 或者只在一个专门的分支上,例如master,专门运行lerna publish进行发布
坑3:运行lerna publish如果中途有包发布失败,再运行lerna publish的时候,因为Tag已经打上去了,所以不会再重新发布包到NPM
解决办法:
1. 运行lerna publish from-git,会把当前标签中涉及的NPM包再发布一次,PS:不会再更新package.json,只是执行npm publish
2. 运行lerna publish from-package,会把当前所有本地包中的package.json和远端NPM比对,如果是NPM上不存在的包版本,都执行一次npm publish
版本号的变更
分为independent模式和fix模式,上面第一张图其实是independent模式,就是每个包有自己的版本号,再附上一张fix模式的图,主要的差异部分用红色标出来了
其他问题
lerna3.x只支持npm,内部的可以用@ali/lerna,但是比较头疼的是如果packages里面既有要发外部的包,又有要发内部的包
目前的解法是将所有要发内部的包,package.json里面加上private:true,发布的步骤变成了:
1. 运行lerna version更新package.json和打Tag,这一步也会更新private:true的包
2. 运行lerna publish from-git,将刚刚更新的包发布到npm,这一步会忽略private:true的包
3. 写个自动化脚本,先把private:true的包改为private:false,代用tnpm publish发布,然后再把private改回来