成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

2021年管理Monorepo代碼庫的11種出色工具

開發 開發工具
如今,許多工具可以在20個不同的文件夾中運行“npm install”和“npm run build”。但是,并不是所有的工具都能促進正確的monorepo。

 [[360304]]

如今,許多工具可以在20個不同的文件夾中運行“npm install”和“npm run build”。但是,并不是所有的工具都能促進正確的monorepo。

促進一個正確的單體開發意味著要解決一些挑戰,比如為分離的模塊運行測試和構建過程,能夠從項目中獨立發布模塊,以及管理變更對項目中每個受影響的依賴模塊的部分影響。

挑戰的清單還在繼續,甚至包括“瑣碎”的事情,比如你如何管理issues和PRs,這可能會隨著你的開發規模而變得困難。

請注意,一個monorepo不是一個整體的應用程序(!) ——它不是一次性構建或部署的,它是一組單獨開發的應用程序。

什么是 monorepo?

國慶期間10月5日尤大公開了vue3.0已完成的源碼,也是采用了monorepo管理模式,看來monorepo確實有其獨到的優勢。

monorepo是一種將多個package放在一個repo中的代碼管理模式,摒棄了傳統的多個package多個repo的模式。

目前 Babel, React, Angular, Ember, Meteor, Jest等許多開源項目都使用該種模式來管理代碼。

解決的問題

  • 多個repo難以管理,編輯器需要打開多個項目;
  • 某個模塊升級,依賴改模塊的其他模塊需要手動升級,容易疏漏;
  • 公用的npm包重復安裝,占據大量硬盤容量,比如打包工具webpack會在每個項目中安裝一次;
  • 對新人友好,一句命令即可完成所有模塊的依賴安裝,且整個項目模塊不用到各個倉庫去找;

帶來的問題

  • 所有package代碼集中在一個項目,單個項目體積較大;
  • 所有package代碼對所有人可見,無法做權限管理;

在這篇綜述中,我收集了一些世界上最好的工具來構建一個“monorepo”,你可以在一個項目里面構建多個模塊,并且有不錯的開發者體驗,可以擴展。

這個列表并沒有進行排名,旨在根據每個工具的優點來概述其優勢。希望能幫助你節省時間,找到合適的工具。

歡迎在下方評論,分享自己的心得。

1. Yarn Workspaces

Yarn Workspaces 的目標是簡化與monorepos的工作,以更明確的方式解決 yarn link 的一個主要用例。你的依賴關系可以鏈接在一起,這意味著你的工作空間可以相互依賴,同時總是使用最新的代碼。這也是比 yarn link更好的機制,因為它只影響你的工作空間樹而不是你的整個系統。

Workspaces有助于解決一些問題,使其成為一個很好的單兵裝備。

  • 它設置了一個單一的 node_modules,不需要在項目中的不同包中重復或克隆依賴關系。
  • 你的所有項目依賴都將被安裝在一起,從而給Yarn更大的空間來更好地優化它們。
  • Yarn將使用一個單一的鎖文件,而不是為每個項目使用不同的鎖文件,這意味著更少的沖突和更容易的審查。
  • 它允許你改變你的一個軟件包的代碼,并讓使用它的其他軟件包立即看到這些變化。對一個包的源代碼的任何修改都會立即應用到其他包中。

因此,Yarn Workspaces是一個非常強大的組合,可以和列表中的幾乎所有工具,特別是Bit、Nx和Lerna等工具一起使用,作為你的monorepo管理抽象的下層。

不過,你也可以直接用workspaces發布。當一個工作空間被打包到一個存檔中時,它會動態地將任何 workspace: 依賴關系替換為一個包的版本,因此您可以將結果包發布到遠程注冊表,而無需運行中間步驟——消費者將能夠像使用任何其他包一樣使用發布的工作空間。太酷了!

2. Bit

Bit是用于構建模塊化項目的下一代工具。這是一種新的、令人興奮的單倉庫方法,在這種方法中,由同一個項目(同一個Bit工作空間)管理的模塊實際上分布在不同的范圍內,而不考慮倉庫。

Bit讓你以完全解耦的方式拆分模塊的開發,享受簡單的、整體的開發體驗來協調一切。

使用bit,你可以在你的項目中解耦組件,這樣每個組件都是獨立開發、構建、測試和發布的。每個組件都是使用特殊的環境進行開發和構建的,這些環境是可擴展和可重用的,這樣你就可以快速定制和再次使用它們。

Bit的工作空間管理著項目中所有組件之間的關系。當你對任何組件進行更改時,Bit會單獨構建和測試它,并將更改傳播到依賴關系圖中。

組件可以作為獨立的包,批量發布到NPM和/或bit.dev平臺,用于協作、消費和文檔。

Bit的UI可以幫助你查看你的monorepo的開發情況。當你編寫代碼時,每個組件都會被記錄、測試、構建等,你可以通過實時反饋和熱重載直觀地看到正在發生的事情。

Bit提供了解耦的開發環境--可重用和可定制的模塊,這些模塊將獨立組件整個生命周期所需的不同服務配置和“捆綁”在一起,如編譯、捆綁、測試、磨合、文檔等。

Bit的工作空間以簡單而全面的方式解耦組件開發

掌握組件圖——Bit定義、管理并幫助你利用項目中所有組件之間的關系。

圖形驅動的構建——當您對某個組件進行更改時,Bit會自動檢測依賴于它的其他組件,并“知道”只構建依賴組件的受影響的圖形。

“圖形驅動的構建”也意味著,萬一一個組件被標記了新的發布版本(在被導出到Bit的云端之前),Bit不僅會在每個受影響的組件上運行構建,而且會確保給它們標記一個新的發布版本。

隔離的測試和構建——每個組件都是在項目外部隔離地構建和測試的,因此您可以確切地看到更改的影響。

組件構建管道——您可以在可重用的管道中構建作業,該管道可應用于項目或所有項目中的所有組件。

批量發布——在Bit monorepo中開發的每個組件都可以作為一個獨立的包發布。Bit去掉了配置每個組件的“package.json”和其他設置文件的所有開銷。你要做的就是運行'bit tag',這樣Bit就會自動給所有修改過的組件打上版本補丁(支持semver規則),然后批量發布修改。

可重復使用的文檔模板——每個組件都使用可重復使用和可定制的模板進行文檔化,Bit為您自動完成大部分工作。用MDX工作?也許還可以添加一些可視化的例子?沒問題。

獨立渲染的組合——每個組件都是完全獨立渲染的,完全在項目之外渲染,渲染的視覺效果(在編寫代碼時熱重新加載)成為每個組件文檔的一部分。

3. NX

NX是一套先進的可擴展的開發工具,適用于monorepos,非常強調現代全棧Web技術。

空NX monorepo

NX的目標是通過CLI(帶編輯器插件)提供整體的開發體驗,并提供可控代碼共享和一致代碼生成的功能。它還提供了增量構建,因此它不會在你的每一次提交中重建和重新測試所有內容,從而加快構建時間。

有了Nx,你可以使用你喜歡的框架,集成你可能已經在使用的現代工具。例如,NX可以讓你使用與Cypress、Jest、Typescript、Prettier和其他工具的開箱即用的集成。

NX團隊還提供了NX云,通過云中的智能計算記憶和更快的構建來幫助使用NX的團隊更快地交付。

4. Rush

Rush是由微軟+開源的一個強大的monorepo基礎設施,它的目的是幫助你在一個倉庫中構建和發布許多包。

登陸頁面和一些組件,兩個項目,一個倉庫

rush的一些主要功能包括一個單一的NPM安裝(也可以和Yarn和pnpm一起使用),所以你可以將所有項目的所有依賴關系安裝到一個共同的文件夾中,使用隔離的符號鏈接為每個項目重新構建一個準確的“node_modules”文件夾。

這也有助于確保沒有幻影依賴,所以你不會意外地導入一個在package.json中缺失的庫,也不會在node_modules中發現10份lib的依賴重復。

Rush交互式CLI不錯

自動本地鏈接意味著你所有的項目都會自動地相互建立符號鏈接,當你做了一個改變,你可以看到下游的效果,而不需要發布任何東西,也沒有任何 npm link 的麻煩。

Rush獨特的安裝策略為你的所有項目生成一個快速安裝的單一收縮/鎖定文件。Rush會檢測你的依賴關系圖,并以正確的順序構建你的項目,所以如果兩個包之間沒有直接的依賴關系,Rush會將它們作為單獨的進程并行構建。

如果你只打算使用你的repo中的幾個項目,Rush提供了子集和增量構建,所以 rush rebuild --to 只對你的上游依賴進行干凈的構建。在你做了修改之后,rush rebuild --from 只對受影響的下游項目進行清理。而 rush build 則提供了強大的跨項目增量構建,Rush甚至可以通過分離項目的版本來處理循環依賴關系。

當你想發布的時候,Rush支持批量發布,所以它會檢測哪些包有變化,自動跳轉所有相關的版本號,并在每個文件夾中運行 npm publish 。

Rush還有助于實施和執行發展政策。例如,當創建PR時,你可以要求開發人員提供受影響項目的主要/次要/補丁日志條目,這些條目隨后將在發布時匯總到一個變更日志文件中。它還可以幫助你執行諸如發布前的審查、特定的依賴版本等東西。

5. Lerna

Lerna(以多頭野獸Hydra的家命名)是一個“用于管理帶有多個包的JavaScript項目的工具”。

[[360308]]

Lerna的創建是為了解決Babel的多包問題,以優化使用git和npm管理多包倉庫的工作流程,它本質上是一種工具和腳本,可以有效地管理和發布許多獨立版本的包在一個Git倉庫中。

  1. my-lerna-repo/ 
  2.   package.json 
  3.   packages/ 
  4.     package-1/ 
  5.       package.json 
  6.     package-2/ 
  7.       package.json 

Lerna 的兩個主要命令是 lerna bootstrap 和 lerna publish。bootstrap 會將 repo 中的依賴關系連接在一起,publish 會幫助發布任何更新的包。

您可以使用以下兩種模式之一來管理項目:固定(Fixed)或獨立(Independent)。

固定模式的Lerna項目是以單一的版本行來操作的,版本是保存在你的項目根目錄下的 lerna.json 文件中的 version 鍵。當您運行 lerna publish 時,如果一個模塊在上次發布后被更新,它將被更新到您發布的新版本。這是Babel目前使用的模式。

一個帶有Yarn Workspaces的Lerna例子

獨立模式Lerna項目允許維護者相互獨立地增加包的版本,每次發布時,你都會收到一個提示,提示你每一個已經改變的軟件包,以指定它是一個補丁,小的,大的或自定義的變化。獨立模式可以讓你更具體地更新每個包的版本,對于一組包來說是有意義的。

“lerna.json”文件是一個匹配包含 package.json 的目錄的globs列表,這也是lerna識別“葉子”包的方式(相對于管理整個repo的開發依賴和腳本)。例子:

  1.   "version""1.1.3"
  2.   "npmClient""npm"
  3.   "command": { 
  4.     "publish": { 
  5.       "ignoreChanges": ["ignored-file""*.md"], 
  6.       "message""chore(release): publish"
  7.       "registry""https://npm.pkg.github.com" 
  8.     }, 
  9.     "bootstrap": { 
  10.       "ignore""component-*"
  11.       "npmClientArgs": ["--no-package-lock"
  12.     } 
  13.   }, 
  14.   "packages": ["packages/*"

即使你不打算發布到NPM,Lerna仍然可以在monorepo中幫助管理版本管理和常見的開發任務。

6. Bazel構建系統 (Google)

谷歌推出了Bazel build system,它是一個類似于Make、Maven和Gradle的開源構建和測試工具,使用的是人類可讀的高級構建語言。Bazel支持多種語言的項目,并為多種平臺構建輸出。它支持大型單一倉庫中的大型代碼庫或跨多個倉庫的大型代碼庫和大量用戶。

Uber開發者使用Bazel來構建他們的Go monorepo。Uber用Go編寫了大部分的后端服務和庫,在2018年,這些服務和庫都被歸納到一個大型的Go monorepo中,現在有超過10萬個文件。Bazel讓這個項目得以擴展,縮短了構建時間,并支持其發展。

這是一個不錯的小型開源項目,以Bazel作為演示:thundergolfer/example-bazel-monorepo

Bazel被設計成大規模工作,并支持跨分布式基礎設施的增量密封構建,這是大型代碼庫所必需的。有了Bazel的遠程緩存,構建服務器還可以共享它們的構建工件。Bazel緩存所有以前完成的工作,并跟蹤對文件內容和構建命令的更改。只有在包或包的依賴關系發生更改時,才構建和測試包。

Bazel可以在Linux、macOS和Windows上運行。Bazel可以從同一個項目為多個平臺構建二進制文件和可部署的包,包括桌面、服務器和移動設備。支持許多語言,你可以擴展Bazel來支持任何其他語言或框架。

7. Buck構建系統 (Facebook)

Buck是一個鼓勵創建由代碼和資源組成的小型可重用模塊的構建系統,支持不同平臺上的各種語言。

它是由Facebook開發和使用的,作為FB單體的官方構建系統,由于被Uber開發者等團隊使用,大大縮短了構建時間,因此名聲大噪。而AirbnbEng的團隊則將構建速度提高了50%,將應用程序縮小了30%。

Uber憑借buck獲得了更好的構建結果

Buck被設計用來構建一個monorepo,而對monorepo設計的支持激發了Buck對cell和項目的支持。

Facebook的經驗是,將所有的依賴關系維護在同一個版本庫中,可以更容易地確保所有開發者擁有正確的代碼版本,并簡化了進行原子提交的過程。

Buck常用于Android和iOS開發。

8. Pants構建系統(Twitter)

2014年,Twitter推出了名為Pants的monorepo構建系統。今天,在v2版本上,Pants的目標是成為一個快速、可擴展的構建系統,以適應不斷增長的代碼庫。目前,它的重點是Python,很快就會支持其他語言。

Pants使用細粒度的工作流,并將每個工作單元與副作用隔離,因此可以利用所有可用的內核。Pant的一些最佳特性包括明確的依賴建模、細粒度的無效化、共享結果緩存、并發執行、遠程執行,以及通過插件API的可擴展性和可定制性。

Pants引擎是用Rust寫的,為的是性能。構建規則是用類型化的Python 3寫的,為了熟悉和簡單。該引擎的設計使得細粒度的無效化、并發性、密封性、緩存和遠程執行自然發生,而無需規則作者的干預。

9. Please構建系統

Please是一個跨語言的構建系統,強調高性能、可移植性、可擴展性和正確性。

[[360309]]

請確保構建步驟是在自己的密封環境中執行的,只能訪問被賦予權限的文件和env變量。增量構建意味著它只構建它需要的東西,它還提供了任務并行性,以及分布式緩存,以實現大規模的可靠和高性能的構建系統。

Please的目標也是專注于開發體驗,所以你可以享受一個常用的CLI,并為使用自動完成的常見任務定義別名。

Please用Go編寫,Please提供所有這些用戶體驗,沒有運行時依賴。并且,沒有需要處理太多配置的單個大工作區文件。

10. Oao

Oao并不是列表中最成熟、最豐富、最容易使用的工具,但它還是很有趣。它是一個基于Yarn的,有意見的monorepo管理工具,p提供monorepo功能,如安裝所有的依賴關系,添加/刪除/升級子包的依賴關系,驗證版本號,確定更新的子包,一次性發布所有的東西,更新變更日志等。

Oao可以讓你在所有子包上運行命令或 package.json 腳本,串行或并行,可選擇遵循反向依賴樹。而且,它支持yarn workspaces,從整體上優化了monorepo依賴樹,簡化了bootstrap以及依賴的添加/升級/刪除。

支持非單包發布:從oao’s的發布前檢查、標簽、版本選擇、變更日志更新等方面受益,也可以在你的單包、非單包中使用。需要注意的是,Oao使用的是同步版本方案,所以在根級的 package.json 中配置了一個主版本,而子包也將與該版本同步。你可以在這里嘗試一下。

11. Bolt

Boltpkg旨在成為一個“超級功能JavaScript項目管理工具”。

Bolt在Yarn的基礎上實現了workspaces的概念。Bolt CLI在很大程度上是Yarn CLI的替代品,你可以在任何Yarn項目中使用它。

我們知道,workspaces是嵌套在一個更大的項目/repo中的,每個workspaces都可以有自己的依賴關系,有自己的代碼和腳本。workspaces也可以歸入子目錄進行組織。

使用Bolt,你可以一次安裝所有這些包的依賴關系(而且你可以做得非常非常快)。而且,當你從一個工作區指定一個依賴關系到另一個工作區時,它將被鏈接到源代碼。這樣,當你去測試你的代碼時,你所有的變化都會被一起測試。

來源:https://blog.bitsrc.io/11-tools-to-build-a-monorepo-in-2021-7ce904821cc2

作者:Jonathan Saring

本文轉載自微信公眾號「前端全棧開發者」,可以通過以下二維碼關注。轉載本文請聯系前端全棧開發者公眾號。

 

責任編輯:武曉燕 來源: 前端全棧開發者
相關推薦

2021-04-21 10:42:05

開源技術 工具

2021-08-07 09:30:40

Kubernetes容器

2021-06-10 05:43:01

開源Kubernetes容器

2019-09-24 09:37:36

Python 開發編程語言

2022-02-14 09:12:00

無代碼低代碼開發工具

2021-04-29 15:12:28

IT監控DevOpsSRE

2021-11-13 08:32:41

lerna Monorepo 項目

2021-02-18 00:19:40

編程語言程序員工具

2021-04-26 08:28:55

數據科學機器學習數據科學工具

2017-03-09 18:00:30

JavaScript代碼

2020-05-12 10:36:55

設備技術物聯網

2019-12-17 08:00:12

Kubernetes工具計算平臺

2021-07-23 09:00:00

數據庫安全工具

2020-06-09 10:24:58

JavaScript開發技術

2010-08-12 17:31:06

虛擬化

2021-02-01 11:03:26

數據科學庫數據科學家數據科學

2021-12-29 18:55:55

工具Go 代碼

2021-01-07 15:01:09

編程語言JavaPython

2018-10-12 10:59:32

云計算混合云多云

2020-02-11 12:35:19

Kubernetes容器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产免费一区二区 | 日本网站免费在线观看 | 国产美女一区二区 | 操操网站| 成人亚洲视频 | 日本黄色免费视频 | www.日韩系列| www.日本在线 | av在线播放不卡 | 自拍偷拍欧美 | 国产95在线 | av免费看在线 | 91精品国产91久久久久久密臀 | 国产精品视频免费看 | 欧美黄色片 | 人人射人人插 | 日韩三片 | 日韩一区在线播放 | 99只有精品| 亚洲欧洲精品一区 | 国内成人免费视频 | 99久久国产 | 亚洲一区 中文字幕 | 国产99久久精品一区二区永久免费 | 成人一区二区三区在线观看 | 精品一区二区电影 | 91久色 | 99精品视频在线 | 国产精品免费一区二区三区四区 | 一区二区三区成人 | 亚洲视频免费在线播放 | 成人综合久久 | 一区精品在线观看 | 日皮视频免费 | 日本久久一区 | 中文字幕一区在线 | 福利精品 | 日韩精品久久久 | 欧美日韩国产综合在线 | 精品久久久久久久久久久久久久 | 99久久久久久 |