2022 了,你還不知道 Multi-repo 和 Mono-repo 的區(qū)別么?
Multi-repo 和 Mono-repo 是 Git 托管代碼的兩種策略,我們討論下兩者的策略以及其利弊。
引言
大多數(shù)現(xiàn)代項(xiàng)目都是在 Git 上管理和托管的。Git 已經(jīng)成為來(lái)自世界各地的分布式源代碼管理、版本控制和協(xié)作的標(biāo)準(zhǔn)平臺(tái)。Git 是快速和高效的,主要有兩種方法來(lái)托管和管理 Git 代碼:
- Mono-repo
- Multi-repo
在深入研究這些方法之前,讓我們先了解一下 Repo 是如何工作的。
Repos 是什么?
倉(cāng)庫(kù)(Repo)包含項(xiàng)目的所有文件夾和文件。它還包含關(guān)于用戶、人和計(jì)算機(jī)的信息。
Git 倉(cāng)庫(kù)數(shù)據(jù)受版本控制,Repo 可以由個(gè)人或團(tuán)隊(duì)成員擁有。
Git 倉(cāng)庫(kù)可以是公開的,私人的,或者是內(nèi)部的。GitHub 是 Git 倉(cāng)庫(kù)的一個(gè)托管服務(wù),并且有一個(gè)用戶界面。
Git 提供了版本控制和代碼共享功能,Git 的特別之處在于,如果開發(fā)人員想對(duì)他們的文件做一些修改,他們可以將整個(gè)存儲(chǔ)庫(kù)復(fù)制到他們的本地系統(tǒng)中。因此,即使開發(fā)人員沒有對(duì)特定項(xiàng)目的寫入權(quán)限,他們也可以在本地復(fù)制內(nèi)容并修改它們(我們稱為 forking)。
此外,如果開發(fā)人員希望共享本地所做的更改,他們可以向項(xiàng)目所有者發(fā)送一個(gè) “pull request”。
一個(gè)項(xiàng)目可以只有一個(gè)服務(wù)。如果你的項(xiàng)目有多個(gè)工作流,你可以為每個(gè)工作流創(chuàng)建多個(gè)服務(wù)。大多數(shù)開發(fā)人員喜歡將較大的項(xiàng)目拆分為具有一個(gè)或多個(gè)功能的較小的獨(dú)立服務(wù)。每個(gè)服務(wù)都可以解決各種業(yè)務(wù)問(wèn)題。隨著 serverless 框架的流行,用戶可以將功能作為服務(wù)訪問(wèn)。
一旦你創(chuàng)建了這些函數(shù)——作為服務(wù)并部署它們,下一步就是對(duì)它們構(gòu)造和版本控制——你可以將所有的服務(wù)放在一個(gè)存儲(chǔ)庫(kù)(mono-repo)中,或者為你擁有的每個(gè)服務(wù)擁有一個(gè)單獨(dú)的存儲(chǔ)庫(kù)(multi-repo) !
什么是 Mono-repo?
在 mono-repo 方法中,你可以將所有服務(wù)保存在單一(mono)存儲(chǔ)庫(kù)中。你仍然可以獨(dú)立地部署和管理每個(gè)服務(wù)。這些服務(wù)可以共享公共庫(kù)和代碼。
像 Facebook、 Google 和 Dropbox 這樣的公司都使用 Mono-repo。
Mono-repo 的優(yōu)勢(shì)
Mon-repo 方式有許多優(yōu)點(diǎn):
- 存儲(chǔ)所有項(xiàng)目代碼的單獨(dú)位置,團(tuán)隊(duì)中的每個(gè)人都可以訪問(wèn)。
- 易于重用和共享代碼,與團(tuán)隊(duì)合作。
- 很容易理解你的變更對(duì)整個(gè)項(xiàng)目的影響。
- 代碼重構(gòu)和代碼大變更的最佳選擇。
- 團(tuán)隊(duì)成員可以獲得整個(gè)項(xiàng)目的總體視圖。
- 易于管理依賴關(guān)系。
Mono-repo 的劣勢(shì)
當(dāng)然,Mono-repo 也有一些缺點(diǎn),主要表現(xiàn)在性能上。如果你的項(xiàng)目增長(zhǎng),每隔一天都會(huì)添加更多的文件,那么 git checkout、pull 和其他操作可能變得緩慢,以及文件搜索可能需要更長(zhǎng)的時(shí)間。
此外,如果你為你的項(xiàng)目雇傭了許多獨(dú)立的承包商,那么讓他們?cè)L問(wèn)整個(gè)代碼庫(kù)可能不那么安全。
此外,實(shí)現(xiàn)持續(xù)部署(Continuous deployation,CD)也很困難,因?yàn)樵S多人可以合入他們的更改,而持續(xù)集成(Continuous Integration,CI)系統(tǒng)可能需要進(jìn)行多次重構(gòu)。
使用 Mono-repo 的大公司都有自定義工具來(lái)處理擴(kuò)展問(wèn)題。例如,F(xiàn)acebook 使用自定義文件系統(tǒng)和源代碼控制。
什么是 Multi-repo?
在 Multi-repo 方法中,存在多個(gè)存儲(chǔ)庫(kù),它們承載一個(gè)項(xiàng)目的多個(gè)庫(kù)和服務(wù)。如果服務(wù)發(fā)生更改,開發(fā)人員只需重新構(gòu)建該服務(wù),而不需要構(gòu)建整個(gè)項(xiàng)目。個(gè)人和團(tuán)隊(duì)可以從事他們特定的服務(wù),他們只能訪問(wèn)他們有權(quán)限的服務(wù)。
像 Netflix 和 Amazon 這樣的公司使用 Multi-repo。
Multi-repo 的優(yōu)勢(shì)?
采用 Multi-repo 的公司數(shù)量遠(yuǎn)遠(yuǎn)多于采用 Mono-repo 的公司,原因如下:
- 每個(gè)服務(wù)和庫(kù)都有自己的版本控制。
- 代碼 checkout 和 pull 是小型且獨(dú)立的,因此即使項(xiàng)目規(guī)模增大,也不存在性能問(wèn)題。
- 團(tuán)隊(duì)可以獨(dú)立工作,不需要訪問(wèn)整個(gè)代碼庫(kù)。
- 更快的開發(fā)和靈活性。
- 每個(gè)服務(wù)都可以單獨(dú)發(fā)版,并有自己的部署周期,從而使 CI 和 CD 更易于實(shí)現(xiàn)。
- 更好的權(quán)限訪問(wèn)控制——所有的團(tuán)隊(duì)不需要完全訪問(wèn)所有的庫(kù)——需要的時(shí)候,再獲得讀訪問(wèn)權(quán)限。
Multi-repo 的劣勢(shì)
- 跨服務(wù)和項(xiàng)目使用的公共依賴和庫(kù)必須定期同步以獲得最新版本。
- 某種程度上鼓勵(lì)孤立文化,導(dǎo)致重復(fù)代碼和各個(gè)團(tuán)隊(duì)試圖解決相同問(wèn)題。
- 每個(gè)團(tuán)隊(duì)可能遵循不同的一組最佳實(shí)踐來(lái)編寫代碼,從而導(dǎo)致難以遵循通用的最佳實(shí)踐。
Mono Repo 和 Multi Repo 的區(qū)別
讓我們來(lái)概括 Mono Repo 和 Multi Repo 的區(qū)別:
Mono-repo | Multi-repo |
一個(gè)組織的所有項(xiàng)目的所有代碼都駐留在中央存儲(chǔ)庫(kù)中(譯者:這里感覺可能有點(diǎn)絕對(duì)) | 每個(gè)服務(wù)和項(xiàng)目都有一個(gè)單獨(dú)的存儲(chǔ)庫(kù) |
團(tuán)隊(duì)可以一起協(xié)作和工作; 他們可以看到彼此的變化 | 團(tuán)隊(duì)可以自主工作; 個(gè)人的變更不會(huì)影響其他團(tuán)隊(duì)或項(xiàng)目的變更 |
每個(gè)人都可以訪問(wèn)整個(gè)項(xiàng)目結(jié)構(gòu) | 管理員可以將訪問(wèn)控制限制到開發(fā)人員需要訪問(wèn)的項(xiàng)目或服務(wù) |
如果項(xiàng)目規(guī)模不斷增長(zhǎng),則可能會(huì)出現(xiàn)并放大問(wèn)題 | 良好的性能,因?yàn)橛邢薜拇a和較小的服務(wù)單元 |
難以實(shí)現(xiàn)持續(xù)部署(CD)和持續(xù)集成(CI) | 開發(fā)人員可以很容易地實(shí)現(xiàn) CD 和 CI,因?yàn)樗麄兛梢元?dú)立地構(gòu)建服務(wù) |
開發(fā)人員可以輕松地共享庫(kù)、 api 和其他在中央存儲(chǔ)庫(kù)中更新的公共代碼 | 對(duì)庫(kù)和其他常見代碼的任何更改都應(yīng)該定期同步,以避免以后出現(xiàn)問(wèn)題 |
總結(jié)
Mono-repo 和 Multi-repo 同樣流行,哪一個(gè)更好取決于你的項(xiàng)目大小、項(xiàng)目需求以及你需要的版本控制和訪問(wèn)控制級(jí)別。
Mono-repo 側(cè)重一致性,而 Multi-repo 側(cè)重于解耦。在 Mono-repo 中,整個(gè)團(tuán)隊(duì)可以看到某一個(gè)人完成的更改,而 multi-repo 為每個(gè)團(tuán)隊(duì)創(chuàng)建一個(gè)單獨(dú)的 repo,這些團(tuán)隊(duì)只能訪問(wèn)所需的倉(cāng)庫(kù)。如果你想為你的項(xiàng)目使用 mono-repo 和 multi-repo 的組合,你可以使用 meta,一個(gè)管理多個(gè)項(xiàng)目和庫(kù)的工具。
原文地址:Mono-Repo vs Multi-Repo: Throwing Light On Code Repository Strategies
原文作者:Butterfly Thoughts
譯者:Gopal