1.什么是monorepo?
Monorepo 它是一种管理 organisation 代码的方式,在这种方式下会摒弃原先一个 module 一个 repo 的方式,取而代之的是把所有的 modules 都放在一个 repo 内来管理。
目前诸如 Babel, React, Angular, Ember, Meteor, Jest 等等都采用了 Monorepo 这种方式来进行源码的管理。
2.git 多仓库管理的缺点
- 管理调试困难
- 分支管理混乱
- 依赖关系复杂
- 三方依赖版本可能不一致
- 占用总空间大
- 不利于团队协作
每个小点,需要仔细分析其困难
3.什么是lerna?
Lerna 就是基于Monorepo 理念的工具实现。使用lerna 管理的目录结构:
├── packages
│ ├─ module-a
│ │ ├─ src # 模块 a 的源码
│ │ └─ package.json # 自动生成的,仅模块 a 的依赖
│ └─ module-b
│ ├─ src # 模块 b 的源码
│ └─ package.json # 自动生成的,仅模块 b 的依赖
├── tsconfig.json # 配置文件,对整个项目生效
├── .eslintrc # 配置文件,对整个项目生效
├── node_modules # 整个项目只有一个外层 node_modules
└── package.json # 包含整个项目所有依赖
所有全局配置文件只有一个,这样不会导致 IDE 遇到子文件夹中的配置文件,导致全局配置失效或异常。node_modules 也只有一个,既保证了项目依赖的一致性,又避免了依赖被重复安装,节省空间的同时还提高了安装速度。
兄弟模块之间通过模块 package.json 定义的 name 相互引用,保证模块之间的独立性,但又不需要真正发布或安装这个模块,通过 tsconfig.json 的 paths 与 webpack 的 alias 共同实现虚拟模块路径的效果。
4.如何用lerna进行项目管理:
- npm install —global lerna
- git init monorepo-example cd monorepo-example
- Lerna init
├──packages
├── lerna.json
└── package.json
4. cd packages
5.mkdir monorepo-example-module-a cd monorepo-example-module-a npm init
6.Mkdir monorepo-example-module-core cd monorepo-example-module-core npm init
假设module-a 依赖module-core ,然后在根目录执行
7.cd monorepo-example
8. lerna bootstrap 生成如下的目录结构。
lerna 是业界知名度最高的 Monorepo 管理工具,功能完整.
5.实践monorepo
1.提升common dependencies
2.提升tools 和 build scripts