單體儲存庫與多儲存庫
目錄:
摘要
問題
我們的專案涉及開發三大類軟體:
- 前端圖形介面(GUI)
- 中介軟體服務
- 後端伺服器
在開發時,我們的原始碼管理(SCM)版本控制系統(VCS)是 git。
我們需要選擇如何使用 git 來組織我們的程式碼。
最高層的選擇是組織成「monorepo(單體儲存庫)」、「polyrepo(多儲存庫)」或「混合」:
- Monorepo 意味著我們把所有部分放進一個大儲存庫
- Polyrepo 意味著我們把每個部分放進各自的儲存庫
- 混合意味著 monorepo 與 polyrepo 的某種組合
更多資訊請參見 https://github.com/joelparkerhenderson/monorepo-vs-polyrepo
決策
當組織/團隊/專案相對較小,且快速迭代的優先順序高於維持穩定性時,選擇 monorepo。
當組織/團隊/專案相對較大,且維持穩定性的優先順序高於快速迭代時,選擇 polyrepo。
狀態
已決定。如果/當出現用於管理 monorepo 和/或 polyrepo 的新工具時,願意重新審視。
詳情
假設
我們開發的所有程式碼都是為某一個組織的產品服務的,而不是面向公眾的。也就是說,這家券商(Broker-Dealer)並不打算擁有任何類似公眾志願開發者的群體。
約束
約束在 https://github.com/joelparkerhenderson/monorepo-vs-polyrepo 中有詳細記錄。
立場
我們考慮了 Google、Facebook 等風格的 monorepo。我們認為,任何 monorepo 的擴充套件問題都出現在遙遠的將來,到我們需要的時候,我們將能夠利用與 Google 和 Facebook 相同的實踐。
我們考慮了典型 Git 開源專案風格的 polyrepo,例如 Google Android、Facebook React 等。我們認為,對於公眾參與(例如全世界任何人都可以參與程式碼工作)和單獨可用性(例如專案可以獨立使用,不依賴任何其他部分),這些是最佳選擇。
論證
當組織/團隊/專案相對較小時,我們選擇 monorepo,因為快速迭代的優先順序明顯高於維持穩定性。
當組織/團隊/專案相對較大時,我們選擇 polyrepo,因為維持穩定性的優先順序明顯高於快速迭代。
影響
如果已有 CI+CD 流水線,我們可能需要對其進行調整,以便在一個儲存庫內測試多個專案。
對於 monorepo,CI+CD 的完整構建可能耗時更長,因為 CI+CD 可能會構建 monorepo 中的所有專案。
如果組織/團隊/專案不斷增長,monorepo 將出現擴充套件問題。
monorepo 的擴充套件問題可能使過渡到 polyrepo 變得越來越有價值。
從 monorepo 過渡到 polyrepo 是一項重大的 DevOps 任務,需要計劃、管理和程式設計實現。
相關內容
相關決策
我們將為管理 monorepo(例如 Google Bazel)和 polyrepo(例如 Lyft Refactorator)的相關工具建立決策。
相關需求
我們需要開發能夠與 git 良好協作的 CI+CD 流水線。
相關製品
我們預計儲存庫組織將帶有用於資源供應、配置管理、測試以及類似 DevOps 領域的相關製品。
相關原則
易於撤銷。如果 monorepo 在實踐中行不通,或者領導層不想要,可以很容易地改為 polyrepo。
痴迷於客戶(Customer Obsession)。我們重視讓專案儘快送到客戶手中,並且相信 monorepo 比 polyrepo 能更快地做到這一點,也有助於我們更快地迭代。
志存高遠(Think big)。Google 和 Facebook 是 monorepo 優於 polyrepo 的強力倡導者,因為所有核心產品可以協同開發/測試/部署。
備註
在此新增任何備註。