一步步學習如何用Lerna

前話

Lerna是啥,幹嗎用的,有什麼好處,這裏我引用官方的一段說明:node

將大型代碼庫拆分紅獨立版本的包對於代碼共享很是有用。然而,跨多個存儲庫進行更改是混亂的,很難跟蹤,跨存儲庫的測試變得很是複雜。

爲了解決這些(以及許多其餘)問題,一些項目將把它們的代碼庫組織到多包存儲庫(有時稱爲monorepos)中。像Babel、React、Angular、Ember、Meteor、Jest等項目,以及許多其餘項目在一個存儲庫中開發它們的全部包。
Lerna是一個工具,它優化了使用Git和NPM管理多包存儲庫的工做流。

Lerna還能夠減小開發和構建環境中對大量包副本的時間和空間需求,這一般是將項目劃分爲多個單獨的NPM包的缺點。
複製代碼

我舉個場景來簡單說明,Babel相信大多數人都用,這是個大型的開源項目,包含了core、preset和炒雞多的plugin包等等。git

Babel6及之前的作法是,這些plugin包都是獨立,版本號也獨立維護,所以若是一次版本發佈的時候,若是要統一版本號,就須要全部包都要寫changlog,git pushnpm publish一次,這顯然是個繁瑣複雜並且容易出錯的過程(雖然有腳本能夠解決)。github

那麼有沒有什麼好的解決方案呢?Lerna舉手回答了。npm

Babel7開始,爲了規範統一管理,採用了Lerna管理項目,所以咱們在Babel倉庫中能夠看到packages這個目錄和Lerna的配置信息,它包含了全部官方的包,很顯然解決了每一個包都git push的問題(直接在根目錄統一提交)。有人也許會舉手問了,那每一個包都npm publish這個能夠解麼?json

固然!Lerna有個命令就是幹這樣的事情,直接在根目錄敲下命令lerna publish,Lerna就自動地變動版本號,填寫message,根目錄git push與全部包自動npm publishbootstrap

下面我簡單說下怎麼用。bash

開始

Lerna官網在這裏lernajs.io/,倉庫在這裏github.com/lerna/lerna,可先查看官方詳細的文檔說明。babel

0x00.幾個重要的命令

Lerna有不少強大的CLI命令,我這裏用的有:app

  • lerna init: 初始化項目
  • lerna bootstrap: 自動構建項目
  • lerna ls: 列出當前項目全部包
  • lerna clean: 清理node_modules文件夾
  • lerna add: 添加依賴(相似npm install)
  • lerna publish: 發版

0x01.初始化項目

由於lerna publish是集合了git pushnpm publish的操做,所以咱們須要將項目文件夾鏈接到git倉庫和登陸npm倉庫(我這裏就假設讀者熟悉gitnpm操做)。工具

從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

複製代碼

如上輸出信息可見,由於咱們並無建立包,所以上面操做並無成功發版。

下面咱們建立第一個包。

0x02.第一個包

咱們在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倉庫能夠看到以下結果:

01

02

到這裏咱們就使用Lerna踏出了第一步。

0x03.添加依賴

咱們再建立個包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-modulemy-lerna-indxpackage.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。

0x04.其餘命令

使用命令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》到這裏就結束了,本人只作了簡單的案例說明(其實這是我剛學的哈),若是存在錯誤的地方還請大佬指出,謝謝您的閱讀與支持。

相關文章
相關標籤/搜索