什么是monorepo,为什么要选择他?
正常情况下,多个项目使用多个git仓库来管理的,每个项目维护自己的npm包依赖,这种可以称为mutlirepo
。
monorepo
是多个项目放在一个git仓库中,并以package的方式来划分项目,个人总结他的优点如下:
- 集中管理,减少项目间的差异带来的沟通成本(比如统一的地方处理issue);
- 多个项目相互依赖时调试变得简单;
- 方便管理版本和依赖管理。 为啥要选择他或者说什么时候该选择他呢,我觉得上面的优点说明了一切:类库/组件库等非业务代码都可以使用该方式管理。 目前使用monorepo的有:vue3、vite、babel、element-plus等
monorepo的最佳实践:lerna + yarn workspace
这里不细说lerna
和yarn workspace
的具体用法了,网上有很多这种文章,只谈这两者的合作模式,我的理解是:
- 所有和包依赖相关的都使用
yarn workspace
来处理; - 版本管理和发布则使用
lerna
。 也就是说你的仓库脚本中不应该出现:lerna bootstrap
、lerna add
等lerna
安装包的命令,而是用yarn i
和yarn workspace pkg1 add pkg2
来代替;
lerna版本管理和发布流程:
使用lerna publish
来发布,lerna
会根据你的git提交记录来进行版本管理,并会让你选择版本号,选择完成后lerna
会自动更新相关的版本号然后发布;
如果需要单独发布某个包:lerna publish --force-publish [packageName]