首页 > 技术文章 > monorepo

torri 2019-07-16 17:19 原文

1.什么是monorepo?

Monorepo 它是一种管理 organisation 代码的方式,在这种方式下会摒弃原先一个 module 一个 repo 的方式,取而代之的是把所有的 modules 都放在一个 repo 内来管理。

目前诸如 Babel, React, Angular, Ember, Meteor, Jest 等等都采用了 Monorepo 这种方式来进行源码的管理。

2.git 多仓库管理的缺点

  1. 管理调试困难
  2. 分支管理混乱
  3. 依赖关系复杂
  4. 三方依赖版本可能不一致
  5. 占用总空间大
  6. 不利于团队协作

每个小点,需要仔细分析其困难

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进行项目管理:

  1. npm install —global lerna
  2. git init monorepo-example        cd monorepo-example
  3. 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


 

 

推荐阅读