Monorepo (單體倉庫)

      網友投稿 1253 2022-05-30

      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缺乏每個項目的安全性

      Monorepo (單體倉庫)

      有了分離的存儲庫,可以根據需要授予對存儲庫的訪問權。單一項目允許讀取項目中所有軟件的訪問權,可能會帶來新的安全問題。

      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小時內刪除侵權內容。

      上一篇:解放 IT運維哈藥集團依托華為云 SAP 解決方案實現自身業務聚焦
      下一篇:SpingMVC的常用注解
      相關文章
      亚洲中文字幕乱码熟女在线| 亚洲的天堂av无码| 亚洲色在线无码国产精品不卡| 亚洲经典在线中文字幕| 亚洲电影一区二区| 亚洲AV日韩AV永久无码绿巨人 | 亚洲色自偷自拍另类小说| 亚洲视频在线免费| 亚洲精品视频免费观看| 亚洲精品视频免费观看| 国产a v无码专区亚洲av| 久久亚洲国产精品五月天婷| 爱情岛论坛网亚洲品质自拍| 久久夜色精品国产亚洲av| 在线观看亚洲成人| 亚洲日韩中文无码久久| 久久九九亚洲精品| 亚洲成色在线影院| 亚洲综合激情视频| 亚洲一区在线免费观看| 亚洲首页国产精品丝袜| 亚洲欧美不卡高清在线| 亚洲A∨精品一区二区三区下载| 色窝窝亚洲av网| 亚洲精品成a人在线观看| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲中文字幕无码久久2020| 亚洲夂夂婷婷色拍WW47| 亚洲国产成人综合精品| 国产成人亚洲综合无| 亚洲人妻av伦理| 亚洲日韩精品一区二区三区无码 | 亚洲成色在线综合网站| 亚洲最大成人网色| 亚洲国产综合精品| 亚洲色成人WWW永久在线观看| 亚洲AV无码AV吞精久久| 亚洲国产香蕉人人爽成AV片久久| 久久久久亚洲精品无码网址| 久久久久久久综合日本亚洲| 亚洲男人天堂av|