google爲什麼使用mono-repo

google爲什麼使用mono-repo

三豐 soft張三丰

什麼是monorepo?

Monorepo 它是一種管理 organisation 代碼的方式,在這種方式下會摒棄原先一個 module 一個 repo 的方式,取而代之的是把所有的 modules 都放在一個 repo 內來管理。

目前諸如 Babel, React, Angular, Ember, Meteor, Jest 等等都採用了 Monorepo 這種方式來進行源碼的管理。

git 多倉庫管理的缺點

1.管理調試困難
2.分支管理混亂
3.依賴關係複雜
4.三方依賴版本可能不一致
5.佔用總空間大
6.不利於團隊協作




單體,多倉庫,單體倉庫

google爲什麼使用mono-repo
單體應用 到 多倉庫 到單體倉庫

單體倉庫的優點:代碼規範易於管理 配合自動化工具能夠做到一鍵構建,一鍵部署 易於理解項目整體,開發人員有一個更好的全景視圖 易於重用

誰在用monorepo

google爲什麼使用mono-repo

bazel

Bazel 是 Google 的一款可再生的代碼構建工具。它主要是用於構建 Google 的軟件,處理出現在谷歌的開發環境的構建問題,比如說:大規模數據構建問題,共享代碼庫問題,從源代碼構建的軟件的相關問題。

Bazel 支持多種語言並且跨平臺,還支持自動化測試和部署、具有再現性(Reproducibility)和規模化等特徵。Bazel 在谷歌大規模軟件開發實踐能力方面起着至關重要的作用。
google爲什麼使用mono-repo

Buck

BUCK 是 facebook 開源的安卓高速構建系統,速度完爆 gradle ,更多細節,請自行搜索。

10 行配置從 Android Studio + Gradle 構建體系遷移到 facebook 的 BUCK 構建體系,且保持兩者同時兼容使用,編碼使用 AS ,享受安卓最強大 IDE 的功能,打包、安裝、測試用 BUCK ,享受安卓最快構建系統的暢快淋漓,兩者互不干擾。從此媽媽再也不用擔心我在編譯安卓工程時睡着了,而且真的只要 10 行!

Github 地址:https://github.com/Piasy/OkBuck/blob/master/README-zh.md

示例

一個理想的 monorepo 結構:


.
├── 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 共同實現虛擬模塊路徑的效果。

總結

現在微服務在業界比較認可的就是monorepo的結構,使用這種方式構建的微服務能夠快速開發,快速迭代,而且不影響項目的複用性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章