多包管理工具介紹

Monorepo與Multirepo

這二者都是管理組織代碼的方式,顧名思義 monorepo 就是把全部的相關項目都放在一個倉庫中(好比 React, Angular, Babel, Google...),multirepo 則是按模塊分爲多個倉庫。
參考:REPO 風格之爭:MONO VS MULTInode

Yarn Workspace

使用介紹

工做空間是一種新的方式來設置您的包體系結構,默認狀況下能夠從Yarn 1.0開始。它容許您以這種方式設置多個軟件包,只須要運行yarn install一次便可將全部軟件包安裝在一個通道中。git

你爲何想作這個?github

  1. 依賴關係能夠連接在一塊兒,這意味着工做區能夠相互依賴,同時始終使用最新的可用代碼。這也是一個相對於yarn link更好的機制,由於它隻影響你的工做空間樹,而不是整個系統。
  2. 全部的項目依賴關係都將被安裝在一塊兒,爲Yarn提供更多的自由度來更好地優化它們。
  3. 對於每一個項目,Yarn將使用一個單獨的鎖文件而不是爲每一個工程使用一個不一樣的鎖文件,這意味着更少的衝突和更容易的審查。

如何使用它? 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 workspace與lerna 的關係

Yarn 的工做區是諸如 Lerna 這樣的工具能夠(而且正在)利用的底層機制。 它們將永遠不會試圖提供像 Lerna 那麼高級的功能,但經過實現該解決方案的核心邏輯和 Yarn 內部的鏈接步驟,咱們但願可以提供新的用法並提升性能。工具

參考:

  1. yarn workplaces官網介紹
  2. yarn的介紹及workspace的使用

Lerna

Lerna 它是基於 Monorepo 理念在工具端的實現。

Lerna是一種工具,能夠優化使用git和npm管理多包存儲庫的工做流程。
詳見:官方文檔

安裝使用

// 全局安裝
$ npm install -g lerna

初始化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

添加新的Module

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

發佈Package

Document:lerna publish

安裝項目全部依賴&&連接依賴

Document:lerna bootstrap
Usage:

$ lerna bootstrap

When run, this command will:

  1. npm install all external dependencies of each package.
  2. Symlink together all Lerna packages that are dependencies of each other.
  3. npm run prepublish in all bootstrapped packages (unless --ignore-prepublish is passed).
  4. npm run prepare in all bootstrapped packages.

lerna mode

lerna容許你使用兩種模式來管理你的項目:Fixed or Independent

Fixed/Locked mode (default)

// lerna.json
{
    ...
    "version":"0.0.0"
}

Fixed mode 下在lerna.json文件裏會有一個version:版本號的內容。當你運行lerna publish的時候, 若是packages的一個模塊和上次發佈版本內容比較有過更新,version字段就會更新,也就是說你發佈了一個新版本。
使用這個模式會一塊兒更新packages下全部的package,即便有的package沒有更新過內容。這種模式下全部的package的版本都會保持一致。

Independent mode

執行命令:

lerna init --independent

// lerna.json
{
    ...
    "version":"independent"
}

Independent mode 容許你獨立維護每一個package的版本。每次發佈時,都會提示您已更改的每一個軟件包,你能夠指定此次修改是補丁,次要版本,主要版本,或者本身自定義版本號。

相關文章
相關標籤/搜索