為何大廠開發者紛紛拋棄小倉,轉向大倉monorepo?
話題背景
在軟件開發領域,代碼倉庫的管理方式對項目的效率和協作有著重要影響。
隨著項目結構的日益復雜和開發挑戰的不斷增長,傳統的單一代碼庫(Monolith)在應對多項目、多庫和多服務的情況下顯得力不從心,正是在這個背景下,Monorepo(微服務大倉)和Multirepo(微服務多倉)的概念應運而生。
你怎么看待大小倉之爭?
今天就讓我們來一起聊聊“為什么要用大倉,monorepo比multirepo好在哪里?”
鵝廠工程師的看法
@cheater-CSIG模型開發組長▼
我寫過一篇文章《單一大倉實踐與工業化》。里面講到大倉主要好處是:
- 能在同一個地方建設輔助開發者的工具
- 保證開發者對整個項目的可見性,易于獲取性
- 能批量集中地修復任何一類工程問題。
有人說,他們用了monorepo,實際上是一個超級大shi山。但是,同樣是shi山,集中在一起,就比散落在很多地方的無數小shi堆,治理起來要容易一些。在monorepo下,我們能評估治理的工作量,如果是無數小shi堆兒,根本就沒法治理了。
@tide-CSIG后臺開發工程師▼
個人感覺,monorepo是面向管理者的,是為了簡化項目管理者的管理難度,增加對開發過程的控制力度的工具。
有些一體性強的超大單體應用可能還比較適合,但是對于一個追求靈活、快速迭代的分布式系統強行使用就是災難。
@thom-PCG后臺開發工程師▼
分布式和集中式類似的區別,集中在一個點做好 ,程序員對代碼有理想的追求是值得肯定的,另外上面的都想一次性就做好,每次都更新到最好的版本,最好的代碼,所以可能傾向選擇monorepo。
但是一般理想很美好。顯示很骨感, 通常我們可能都在快速迭代,尋找新的業務增長點,這個時候
multirepo容錯性更好,迭代更快各有優劣~開發好了,就可以一直不改,不動了。
結論:multirepo和monorepo都是工具,作為工程師把工程做好,業務做好才是王道,誰優誰劣都要根據一定的應用場景
@les-CSIG后臺開發工程師▼
換一個角度,多倉庫 + 倉庫多版本,倉庫之間又常常存在依賴關系,這可以將多倉管理規約到依賴管理問題上,而后者又可以規約為3-sat問題,眾所周知,這是NPC問題…
也就是說,帶有多版本的multirepo,使用者容易陷入版本泥潭,腦容量不夠用… 而規避這個由管理模式導致的依賴管理問題,一個簡單直接的方式:只用一個倉庫??
@lucasz-WXG前端開發工程師▼
大倉可能是一種重構后的選擇,也可能是一開始的選型方案,因為業務下的項目呈現是動態的。
主要優勢是能夠更低成本統一和維護 多應用的工程化方案,當然也會帶來工程復雜度的上升。因此判斷條件無非是收益和成本的權衡,以下是可以去考量的幾個點:
- 人員在多個單倉來回開發的上下文差異,導致切換倉庫開發的成本越高,大倉收益越高
- 工程化方案的中配置即代碼的部分占比越大,即工程通過代碼復用,大倉收益就更高
- 復用更統一先進的工程化方案的收益 VS 分散開獨立支撐業務小步快跑獨立性的收益
- 分散的單倉間工程化統一的難度 VS 集中力量應對工程復雜度提升的難度
@folger-CSIG前端開發▼
大倉擔心CI,試試CNB,現在在公測中~
@jom-PCG客戶端開發▼
大倉(Monorepo)與多倉(Multirepo)有各自的優缺點,兩者往往可以互補,具體選擇哪個取決于項目的規模、具體需求、以及團隊的分布,從Monorepo的優缺點來講:
優勢:
- 復用工程化基建:可以統一工程化配置和DevOps流程,包括但不限于Lint規則、構建腳本、測試、CICD流程等,基建的事情只需要做一遍,包括后續統一改造和升級,從而降低多項目維護成本。
- 利于代碼復用:由于所有代碼都在一個倉庫內,依賴的管理可以更加簡化和一致(本地npm包,自動解決依賴關系),依賴的安裝也更高效(共同依賴只會安裝一次)。這樣帶來的好處就是極大降低代碼復用成本,比如需要抽離新的「復用代碼」,創建個npm模塊子項目就能直接進行開發、調試,而如果是Multirepo,需要手動進行npm link或者npm發布,還要手動處理依賴關系,后續的版本升級也比較繁瑣,久而久之,就會降低大家做此類抽離工作的積極性。
- 版本控制更統一:各個項目和模塊可以更容易保持版本的一致性,所有的依賴關系和代碼變更可以在同一個提交中進行更新,能確保整個代碼庫的一致性,這樣也更利于做跨項目的自動化工作流。
- 團隊協作更簡單:代碼的可見性高,有助于跨團隊的知識共享和代碼審查,同時團隊成員之間的協作也更加順暢。
不足:
- 規模和性能問題:隨著項目和代碼量的增長,clone和構建的時間可能會拉長,互相之間的影響也會被放大,任何變更都可能對其他項目產生連鎖反應,增加了變更管理的復雜性,需要更謹慎的規劃和協調。比如A項目修改了BCD都依賴的公共模塊,則需要BCD都經過完整的驗證才能一起發布上線,而不是BCD先保留舊版的公共模塊,按照自己的節奏實施升級;
- 復雜度更高:對于小團隊和項目,大倉可能會引入沒必要的復雜性;
- 工具鏈要求高:對工具和基礎設施提出了更高要求,需要構建和維護適合大型代碼庫的復雜工具鏈和基礎設施。比如使用lerna,rush 或者 Nx 來做Monorepo,要與司內各基建平臺打通就不是那么簡單。
綜上,Monorepo可能更適合大型組織或需要緊密協作的大團隊,而Multirepo則更適合獨立發展且相互依賴性較小的項目。
@shugen -CSIG應用開發▼
對基礎依賴的統一管理和升級很舒服,也更方便做底層能力封裝,CI/CD 方便也簡單不少。