Monorepo (單體倉庫)
1?引言
在版本控制系統中,單體倉庫是一種軟件開發策略,其中許多項目的代碼存儲在同一個倉庫中。截至2017年,這種軟件工程實踐的一些形式已經有十多年的歷史,但一般概念只是最近才被命名。
Google、Facebook、微軟、Uber、Airbnb?和?Twitter都采用了非常龐大的單體倉庫,以不同的策略來擴展構建系統和版本控制軟件,代碼量大,每天都在變化之中。
2?單體倉庫的優勢
與單個存儲庫相比,單一存儲庫有一些潛在的優勢:
2.1?易于代碼重用
類似的功能或通信協議可以被抽象成共享庫,并直接被項目所包含,而不需要依賴包管理器。
2.2?簡化依賴管理
在一個多倉庫環境中,多個項目依賴一個第三方依賴,該依賴可能會被多次下載或構建。在monorepo中,由于被引用的依賴關系都存在于同一個代碼庫中,因此可以輕松優化構建。
2.3?原子提交
當一起工作的項目被包含在不同的倉庫中時,發布需要同步一個項目的某些版本與另一個項目的某些版本。而在足夠大的項目中,管理依賴之間的兼容版本可能會成為依賴的地獄。?在monorepo中,這個問題可以被規避,因為開發人員可以原子性地改變多個項目。
2.4?大規模代碼重構
由于開發人員可以訪問整個項目,因此重構可以確保項目的每一個部分在重構后繼續發揮作用。
2.5?跨團隊的協作
在使用源碼依賴(從源碼編譯的依賴)的monorepo中,團隊可以改進其他團隊正在進行中的項目。這展示了靈活的代碼所有權。
3?限制和缺點
3.1?丟失版本信息
雖然不是必須的,但一些monorepo構建在版本庫中的所有項目上使用一個版本號。這將導致每個項目的轉專有版本信息丟失。
3.2缺乏每個項目的安全性
有了分離的存儲庫,可以根據需要授予對存儲庫的訪問權。單一項目允許讀取項目中所有軟件的訪問權,可能會帶來新的安全問題。
3.3需要更多的存儲空間
使用拆分倉庫,你可以只取你感興趣的項目。
如果是單倉庫,你可能需要獲取所有的項目。
當然,這也取決于版本系統。
比如如果你使用SVN,這就不是問題,因為你可以下載repo的任何單獨部分(甚至是單個目錄)。
4?可擴展性挑戰
擁有大型項目的公司在使用monorepos時遇到了一些障礙,特別是關于構建工具和版本控制系統的問題。?Google的monorepo,據推測是世界上最大的,符合超大規模系統的分類,必須在一個超過80TB的存儲庫中每天處理數以萬計的提交。
4.1?縮放版本控制軟件
很多公司發現,軟件無法有效處理大型單體所需的數據量。
Facebook和微軟分別選擇了版本控制軟件Mercurial和Git,而谷歌則最終創建了自己的版本控制系統。
十多年來,谷歌一直依賴托管在單機上的Perforce。2005年,谷歌的構建服務器一次可以被鎖定10分鐘。進過改進以后,Google在2010年將這一時間改進為30秒--1分鐘。?由于擴展問題,Google最終開發了自己的內部分布式版本控制系統,被稱為Piper。
Facebook遇到了版本控制系統Mercurial的性能問題,并對客戶端做出了大量上游貢獻,并在2014年1月使其比Git中的競爭解決方案更快。
2014年3月,微軟宣布轉而使用Git進行單機版的開發,在過渡過程中,微軟對Git客戶端做出了大量的上游貢獻,通過Virtual File System for Git刪除了不必要的文件訪問,并改進了對大文件的處理。
4.2?縮放構建軟件
很少有構建工具能在單體中很好地工作,而在簽入時對整個版本庫進行構建和持續集成測試的流程將導致性能問題,像Buck、Bazel、Pants和Please這樣的定向圖構建系統通過將構建和測試劃分到開發的活動區域來解決這個問題。
Twitter在2011年開始開發Pants,因為當時Facebook的Buck和Google的Bazel都是閉源的,Twitter在2012年以Apache 2.0 License開源了Pants。
Please是一個基于Go的構建系統,由Thought Machine在2016年開發,他們也是受到谷歌的Bazel的啟發,并對Facebook的Buck表示不滿。
Bazel、Buck、Pants和Please,都使用相同的Starlark(原Skylark)構建語言,這是一種基于Python的特定領域語言。
一些專門的單體構建工具,如Lerna,可以解決重復依賴的獲取,但缺乏有向圖的能力。
5?參考
https://dl.acm.org/doi/10.1145/3328433.3328435
https://medium.com/@brockreece/from-monolith-to-monorepo-19d78ffe9175
https://blog.nrwl.io/misconceptions-about-monorepos-monorepo-monolith-df1250d4b03c
https://en.wikipedia.org/wiki/Monorepo
https://medium.com/@maoberlehner/monorepos-in-the-wild-33c6eb246cb9
軟件開發
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。