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