Lerna是啥,幹嗎用的,有什麼好處,這裏我引用官方的一段說明:node
將大型代碼庫拆分紅獨立版本的包對於代碼共享很是有用。然而,跨多個存儲庫進行更改是混亂的,很難跟蹤,跨存儲庫的測試變得很是複雜。
爲了解決這些(以及許多其餘)問題,一些項目將把它們的代碼庫組織到多包存儲庫(有時稱爲monorepos)中。像Babel、React、Angular、Ember、Meteor、Jest等項目,以及許多其餘項目在一個存儲庫中開發它們的全部包。
Lerna是一個工具,它優化了使用Git和NPM管理多包存儲庫的工做流。
Lerna還能夠減小開發和構建環境中對大量包副本的時間和空間需求,這一般是將項目劃分爲多個單獨的NPM包的缺點。
複製代碼
我舉個場景來簡單說明,Babel相信大多數人都用,這是個大型的開源項目,包含了core、preset和炒雞多的plugin包等等。git
Babel6及之前的作法是,這些plugin包都是獨立,版本號也獨立維護,所以若是一次版本發佈的時候,若是要統一版本號,就須要全部包都要寫changlog,git push
和npm publish
一次,這顯然是個繁瑣複雜並且容易出錯的過程(雖然有腳本能夠解決)。github
那麼有沒有什麼好的解決方案呢?Lerna舉手回答了。npm
Babel7開始,爲了規範統一管理,採用了Lerna管理項目,所以咱們在Babel倉庫中能夠看到packages
這個目錄和Lerna的配置信息,它包含了全部官方的包,很顯然解決了每一個包都git push
的問題(直接在根目錄統一提交)。有人也許會舉手問了,那每一個包都npm publish
這個能夠解麼?json
固然!Lerna有個命令就是幹這樣的事情,直接在根目錄敲下命令lerna publish
,Lerna就自動地變動版本號,填寫message,根目錄git push
與全部包自動npm publish
。bootstrap
下面我簡單說下怎麼用。bash
Lerna官網在這裏lernajs.io/,倉庫在這裏github.com/lerna/lerna,可先查看官方詳細的文檔說明。babel
Lerna有不少強大的CLI命令,我這裏用的有:app
lerna init
: 初始化項目lerna bootstrap
: 自動構建項目lerna ls
: 列出當前項目全部包lerna clean
: 清理node_modules
文件夾lerna add
: 添加依賴(相似npm install)lerna publish
: 發版由於lerna publish
是集合了git push
和npm publish
的操做,所以咱們須要將項目文件夾鏈接到git倉庫和登陸npm倉庫(我這裏就假設讀者熟悉git
和npm
操做)。工具
從git倉庫clone下來新建的項目(可在github或者gitlab建立)而且添加基本的文件,目錄以下:
my-lerna-demo
|--- .gitignore
|--- README.md
複製代碼
這是咱們在根目錄中執行命令lerna init
就能夠初始化項目了,此時目錄以下:
my-lerna-demo
|--- packages #包目錄
|--- .gitignore
|--- lerna.json #lerna配置
|--- package.json
|--- README.md
複製代碼
而後咱們使用lerna publish
提交一次試試,執行以下命令:
> git add *
> git commit -m "init" #執行lerna publish前需提交記錄這次變動
> lerna publish
lerna notice cli v3.10.5
lerna info current version 0.0.0
lerna info Looking for changed packages since initial commit.
lerna success No changed packages to publish
複製代碼
如上輸出信息可見,由於咱們並無建立包,所以上面操做並無成功發版。
下面咱們建立第一個包。
咱們在packages
新建目錄my-lerna-module
而且在該目錄使用命令npm init
初始化後隨意添加一些文件,此時目錄結構以下:
my-lerna-demo
|--- packages
|--- my-lerna-module
|--- package.json
|--- index.js
|--- .gitignore
|--- lerna.json #lerna配置
|--- README.md
複製代碼
而後咱們再次嘗試發版,執行命令和輸出內容以下:
> git add *
> git commit -m "add package my-lerna-module" #執行lerna publish前需提交記錄這次變動
> lerna publish
lerna notice cli v3.10.5
lerna info current version 0.0.0
lerna info Looking for changed packages since initial commit.
? Select a new version (currently 0.0.0) (Use arrow keys)
> Patch (0.0.1)
Minor (0.1.0)
Major (1.0.0)
Prepatch (0.0.1-alpha.0)
Preminor (0.1.0-alpha.0)
Premajor (1.0.0-alpha.0)
Custom Prerelease
Custom Version
複製代碼
此時Lerna給了咱們版本號的選項,小beta版本就選第一個吧(此後每次變動都會遞增版本號,遞增位數可選)
? Select a new version (currently 0.0.0) Patch (0.0.1)
Changes:
- my-lerna-module: 1.0.0 => 0.0.1
? Are you sure you want to publish these packages? (ynH)
複製代碼
此時列舉並詢問是否發佈這些包(也就是npm publish
操做),直接輸入y
,此時輸出如下信息表示Lerna成功執行了發版操做。
......
Successfully published:
- my-lerna-module@0.0.1
lerna success published 1 package
複製代碼
此時查看git倉庫和npm倉庫能夠看到以下結果:
到這裏咱們就使用Lerna踏出了第一步。
咱們再建立個包my-lerna-index
,而且初始化,此時目錄結構以下:
my-lerna-demo
|--- packages
|--- my-lerna-module
|--- package.json
|--- index.js
|--- my-lerna-index
|--- package.json
|--- index.js
|--- .gitignore
|--- lerna.json #lerna配置
|--- README.md
複製代碼
咱們使用命令lerna add
給包添加依賴,命令以下:
> lerna add cross-env #全部包都添加cross-env依賴
> lerna add my-lerna-module --scope=my-lerna-index #給包my-lerna-index添加my-lerna-module依賴
複製代碼
此時咱們看到my-lerna-module
和my-lerna-indx
的package.json
都添加了以下依賴配置:
"dependencies": {
"cross-env": "^5.2.0"
}
複製代碼
其中,my-lerna-index
添加了對my-lerna-module
的依賴配置:
"dependencies": {
"cross-env": "^5.2.0",
"my-lerna-module": "^0.0.1"
}
複製代碼
而後咱們再次發佈個小版本:
> git add *
> git commit -m "add package my-lerna-index" #執行lerna publish前需提交記錄這次變動
> lerna publish
lerna notice cli v3.10.5
lerna info current version 0.0.1
lerna info Looking for changed packages since v0.0.1
? Select a new version (currently 0.0.1) Patch (0.0.2)
Changes:
- my-lerna-index: 1.0.0 => 0.0.2
- my-lerna-module: 0.0.1 => 0.0.2
? Are you sure you want to publish these packages? Yes
......
Successfully published:
- my-lerna-index@0.0.2
- my-lerna-module@0.0.2
lerna success published 2 packages
複製代碼
此時咱們成功發佈了個小版本0.0.2。
使用命令lerna ls
列舉當前項目全部包:
> lerna ls
lerna notice cli v3.10.5
my-lerna-index
my-lerna-module
lerna success found 2 packages
複製代碼
若是想清理項目下全部包的node_modules
目錄,咱們可使用命令lerna clean
:
> lerna clean
lerna notice cli v3.10.5
lerna info Removing the following directories:
lerna info clean packages\my-lerna-index\node_modules
lerna info clean packages\my-lerna-module\node_modules
? Proceed? Yes
......
lerna success clean finished
複製代碼
執行命令lerna bootstrap
則自動更新包的依賴信息至最新而且自動下載依賴包:
> lerna bootstrap
lerna notice cli v3.10.5
lerna info Bootstrapping 2 packages
lerna info Installing external dependencies
lerna info Symlinking packages and binaries
lerna success Bootstrapped 2 packages
複製代碼
《一步步學習如何使用Lerna》到這裏就結束了,本人只作了簡單的案例說明(其實這是我剛學的哈),若是存在錯誤的地方還請大佬指出,謝謝您的閱讀與支持。