1. Monorepo and Multirepo?
Monorepo 和 Multirepo 是两种不同的源码管理理念,Monorepo 是把所有的相关项目都放在一个仓库中(例如:React, Angular, Babel, Jest, Umijs, ...),Multirepo 则是按模块把子项目拆分到多个仓库中(例如:Rollup, ...)。前者允许多元化发展(各项目可以有自己的构建工具、依赖管理策略、单元测试方法),后者希望集中管理,减少项目间的差异带来的沟通成本。
示例1:React 采用 Monorepo 结构组织项目代码
示例2:Babel 也采用 Monorepo 结构
Multirepo 缺点:
Monorepo 优点:
Monorepo 缺点:
)。
图文无关
2. Lerna 是啥?
Lerna is a tool that optimizes the workflow around managing multi-package repositories with git and npm. Lerna 就是用来协助管理 Monorepo 型项目的工具;
下面两张图展示了
基于 Lerna 的 Monorepo 最大优势
图:传统 Multirepo 结构项目的 bug 修正流程
图:基于 Lerna 的 Monorepo项目结构
图文无关
下面给大家展示一个
基于 Lerna 的 Monorepo 项目
完整的构建、开发、发布流程
深刻体会它的优势
3.1. Monorepo 项目搭建
采用 Monorepo 结构
各子项目代码结构最好统一
图:配置 .gitignore
npm install -g lerna
lerna init
图:lerna init 命令
图:Monorepo目录结构说明
3.2. 向 packages 目录添加子项目
图:packages 目录中的子项目
lerna bootstrap
图:lerna bootstrap 命令
图:lerna bootstrap 连接后效果
3.3. 编写统一构建、监控工具
图:监控脚本代码示例
图:npm scripts 示例
图:监控脚本运行效果
参考:
《Repo Style Wars: Mono Vs Multi》: http://www.gigamonkeys.com/mono-vs-multi/ 《Why is Babel a monorepo?》: https://github.com/babel/babel/blob/master/doc/design/monorepo.md 《Advantages of monorepos》: https://danluu.com/monorepo/ 《New wave modularity with Lerna, monorepos, and npm organizations》: https://macwright.org/2016/07/08/lerna-npm-organizations-new-wave-modularity.html 《syncpack 小工具》: https://github.com/JamieMason/syncpack Lerna git 仓库: https://github.com/lerna/lerna