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