背景
公司自己编写的库越来越多,而且之间的关联性比较强,如果某个包升级了版本,其他包也得相对应升级,这样非常的繁琐。
什么是 monorepo 和 multirepo
在讲lerna之前,我们要先了解一下两个不同的代码管理组织方式 monorepo 和 multirepo:
monorepo
:把所有的相关项目放在同一个仓库下,有点类似yarn workspaces
multirepo
:每个子项目拥有自己的 repo
什么是lerna
lerna是一个管理多个javascript包的工具。它属于monorepo
类型,当你的项目有相关联时最好使用monorepo
方式进行管理。
以一个简单的示例进行说明
新建一个testLerna
项目:
1 | $ npx lerna init |
初始化一个lerna命令,生成以下目录结构:
1 | testLerna/ |
pcakges
目录主要放置包,lerna.json
为配置文件。
两种模式
- Fixed/Locked 模式 (默认)
通过在lerna.json
中指定version
,当你运行lerna publish
时,如果其中某一个包至上次发布以来有更新,则将会更新version
。
这个模式是babel目前使用的模式,当你想把所有包关联在一起的时候可以考虑使用这种模式,需要注意的是,当其中某个包升级了大版本之后,其他的每个包都会自动升级大版本。
- Independent mode
1 | lerna init --independent |
独立模式允许您更具体地更新每个包的版本,并对一组组件有意义。跟semantic-release等工具配合使用会更好。
已经有结合使用的示例
发布
假设以下项目:
1 | packages |
shareui依赖shareui-html,shareui-html依赖shareui-font,可以命令添加:
1 | $ lerna add shareui-html --scope=shareui |
前提是要关联git,修改registry到公司私库
git提交到暂存区域,之后通过lerna publish
发布:
1 | $ lerna publish |
以下情况需要考虑:
shareui-font升级了,相对应的shareui-html和shareui也要升级?
运行
lerna bootstrap
升级对应依赖