這二者都是管理組織代碼的方式,顧名思義 monorepo 就是把全部的相關項目都放在一個倉庫中(好比 React, Angular, Babel, Google...),multirepo 則是按模塊分爲多個倉庫。
參考:REPO 風格之爭:MONO VS MULTInode
工做空間是一種新的方式來設置您的包體系結構,默認狀況下能夠從Yarn 1.0開始。它容許您以這種方式設置多個軟件包,只須要運行yarn install一次便可將全部軟件包安裝在一個通道中。git
你爲何想作這個?github
如何使用它? npm
在package.json
文件中添加如下內容。從如今開始,咱們將這個目錄稱爲「workspace root」
:json
# package.json: { "private": true, "workspaces": [ "workspace-a", "workspace-b" ] }
請注意,private: true是必需的!工做區並不意味着要發佈,因此咱們增長了這個安全措施,以確保沒有任何東西能夠意外暴露它們。bootstrap
在建立此文件後,建立兩個名爲workspace-a和workspace-b的新子文件夾。在其中的每一個文件中,使用如下內容建立另外一個package.json文件:安全
# workspace-a/package.json: { "name": "workspace-a", "version": "1.0.0", "dependencies": { "cross-env": "5.0.5" } }
# workspace-b/package.json: { "name": "workspace-b", "version": "1.0.0", "dependencies": { "cross-env": "5.0.5", "workspace-a": "1.0.0" } }
最後,在某個地方運行yarn install,最好在工做區的根目錄下運行。若是一切正常,你如今應該有一個相似的文件層次結構:app
/package.json /yarn.lock /node_modules /node_modules/cross-env /node_modules/workspace-a -> /workspace-a /workspace-a/package.json /workspace-b/package.json
如今須要workspace-a位於workspace-b的文,件你的項目中將使用當前位於項目中的確切代碼,而不是在Github上發佈的代碼,而且cross-env包已被正確地刪除並放在項目的根目錄下,以供二者workspace-a和workspace-b使用。less
Yarn 的工做區是諸如 Lerna 這樣的工具能夠(而且正在)利用的底層機制。 它們將永遠不會試圖提供像 Lerna 那麼高級的功能,但經過實現該解決方案的核心邏輯和 Yarn 內部的鏈接步驟,咱們但願可以提供新的用法並提升性能。工具
參考:
Lerna 它是基於 Monorepo 理念在工具端的實現。
Lerna是一種工具,能夠優化使用git和npm管理多包存儲庫的工做流程。
詳見:官方文檔
// 全局安裝 $ npm install -g lerna
Document:leran init
Usage:
$ lerna init --independent $ lerna init --exact(默認)
Demo:
$ mkdir lerna-repo && cd $_ $ lerna init
這將會建立一份lerna.json配置文件和一個packages文件夾,目錄結構以下:
lerna-repo/ packages/ package.json lerna.json
Document:leran create
Usage:
$ lerna create <name> [loc]
Demo:
$ lerna create package-a packages
而後會在packages下多出一個package-a文件夾:
packages/ package-a/ __test__/ lib/ package.json README.md
能夠單獨對package-a模塊進行管理。
Document:lerna add
Usage:
$ lerna add <package>[@version] [--dev] [--exact] [--peer]
Demo:
# Install module-1 to module-2 $ lerna add module-1 --scope=module-2
Document:lerna publish
Document:lerna bootstrap
Usage:
$ lerna bootstrap
When run, this command will:
npm install
all external dependencies of each package.packages
that are dependencies of each other.npm run prepublish
in all bootstrapped packages (unless --ignore-prepublish
is passed).npm run prepare
in all bootstrapped packages.lerna容許你使用兩種模式來管理你的項目:Fixed or Independent
// lerna.json { ... "version":"0.0.0" }
Fixed mode 下在lerna.json文件裏會有一個version:版本號
的內容。當你運行lerna publish
的時候, 若是packages的一個模塊和上次發佈版本內容比較有過更新,version字段就會更新,也就是說你發佈了一個新版本。
使用這個模式會一塊兒更新packages下全部的package,即便有的package沒有更新過內容。這種模式下全部的package的版本都會保持一致。
執行命令:
lerna init --independent
// lerna.json { ... "version":"independent" }
Independent mode 容許你獨立維護每一個package的版本。每次發佈時,都會提示您已更改的每一個軟件包,你能夠指定此次修改是補丁,次要版本,主要版本,或者本身自定義版本號。