lerna以及lerna-changelog使用

zWing發表於2019-03-06

lerna用於管理多package,且各package可能會互相引用的專案。

lerna通過兩種方式管理子專案的版本號

  • Fixed/Locked mode (default):每次執行lerna publish都會將所涉及到的包升級到最新一個版本,開發者只需要確定釋出下一個version
  • Independent mode:由開發者自行管理子專案的version,每次執行lerna publish都需要確定每個包的下個版本號。

基本使用

以下命令以yarn為主。

Install 安裝

yarn global add lerna

Init 初始化專案

lerna init 命令執行完畢後,會在生成對應的目錄結構。

lerna-repo/
  package.json
  lerna.json
  packages/
    package-1/
      package.json
    package-2/
      package.json
複製程式碼

Lerna.json 配置

{
  "version": "1.1.3", // 專案版本
  "npmClient": "npm", // 預設使用的npm,可改為yarn
  "command": { // lerna 內建命令的配置
    "publish": {
      "ignoreChanges": ["*.md", "**/test/**",], // 釋出時忽略部分檔案的改動,配置此項可以減少不必要的publish。
      "message": "chore(release): publish" // git commit message
    },
  },
  "packages": ["packages/*"]
}
複製程式碼

Create 建立子專案

lerna create <name> 建立一個子專案,並會根據互動提示生成對應的package.json

Add 新增依賴

lerna add <package>[@version] [--dev] [--exact]

  • lerna add eslint: 所有包都會裝上eslint
  • lerna add eslint --scope=package1:只有package1會裝上。
  • lerna add eslint packages/prefix-*:符合prefix的包會裝上。

options:

  • -dev:新增到devDependencies
  • --exact: 只安裝特定版本

如果新增的是子專案,則會通過link軟連線到對應的專案中。 lerna add package1 --scope=package2

Run 執行npm script命令

lerna run <script> -- [..args]

  • lerna run test:則會執行所有子專案中的test
  • lerna run --scope package1 test:只執行package1中的test
  • lerna run --ignore package-* test:只執行除了匹配package-*外的專案中的test

Exec 執行任意命令

lerna exec -- <command> [..args]

lerna run類似,只不過它可以執行任意命令。 eg: lerna exec -- rm -rf ./node_modules

其他命令

  • lerna bootstrap:安裝各子專案依賴,對相互引用的專案進行軟連線,在子專案中執行npm run prepublishnpm run prepare
    • --hoist [glob]:會將子專案的匹配的依賴(eg:eslint, jest等),統一放在根目錄的node_modules中,減少安裝時間,但僅限npmClient=npm
    • —nohoist [glob]: 匹配的依賴(eg: babel)會安裝到子專案中的node_modules
  • lerna clean:刪除子專案的node_modules
  • lerna link:同bootstrap第二步。

進階使用

Lerna-changelog

lerna-changelog基於pr來為專案生成changelog

可參考repo

使用步驟
  • master分支切換出feature/bugfix等分支,參考git-flow
  • 完成開發後進行commit,推薦使用commitizen來規範commit msg,同時有助於對後續子專案生成changelog
  • 將新分支pushremote端。
  • 建立pr,並打上label,此處一定要打上labellearn-changelog就是根據label來確定該pr屬於feature/bugfix/document等。
  • 切記要在merge之前打上label
  • 進行merge pr操作。
  • 本地切換到master分支並進行pull操作。
  • 執行lerna-changelog,既可得到一份changeling
注意

prlabel並不能隨意設定,一定要在專案中宣告對應才生效。

官方預設支援breaking/enhancement/bug/documentation/internal,如果想用其他,則需要在package.json中進行相應的配置。

{
  "changelog": {
    "labels": {
      "feat": ":rocket: New Feature",
      "bug": ":bug: Bug Fix",
      "doc": ":memo: Documentation",
      "internal": ":house: Internal",
      "breaking": ":boom: Breaking Change"
    }
  }
}
複製程式碼

子專案的changelog

尚未實踐過,具體還需參考README

結語

lerna的使用已介紹完畢,上述內容可滿足日常開發需求,更多詳情還需參考官方文件。

相關文章