一步步學習如何用Lerna

pwcong發表於2019-01-17

前話

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

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

為了解決這些(以及許多其他)問題,一些專案將把它們的程式碼庫組織到多包儲存庫(有時稱為monorepos)中。像Babel、React、Angular、Ember、Meteor、Jest等專案,以及許多其他專案在一個儲存庫中開發它們的所有包。
Lerna是一個工具,它優化了使用Git和NPM管理多包儲存庫的工作流。

Lerna還可以減少開發和構建環境中對大量包副本的時間和空間需求,這通常是將專案劃分為多個單獨的NPM包的缺點。
複製程式碼

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

Babel6及以前的做法是,這些plugin包都是獨立,版本號也獨立維護,因此如果一次版本釋出的時候,如果要統一版本號,就需要所有包都要寫changlog,git pushnpm publish一次,這顯然是個繁瑣複雜而且容易出錯的過程(雖然有指令碼可以解決)。

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

Babel7開始,為了規範統一管理,採用了Lerna管理專案,因此我們在Babel倉庫中可以看到packages這個目錄和Lerna的配置資訊,它包含了所有官方的包,很顯然解決了每個包都git push的問題(直接在根目錄統一提交)。有人也許會舉手問了,那每個包都npm publish這個可以解麼?

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

下面我簡單說下怎麼用。

開始

Lerna官網在這裡lernajs.io/,倉庫在這裡github.com/lerna/lerna,可先檢視官方詳細的文件說明。

0x00.幾個重要的命令

Lerna有很多強大的CLI命令,我這裡用的有:

  • 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》到這裡就結束了,本人只做了簡單的案例說明(其實這是我剛學的哈),如果存在錯誤的地方還請大佬指出,謝謝您的閱讀與支援。

相關文章