google為什麼使用mono-repo

語言: CN / TW / HK

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的結構,使用這種方式構建的微服務能夠快速開發,快速迭代,而且不影響專案的複用性。

分享到: