Skip to main content

[npm] Lerna 筆記

TL;DR

# 初始化專案
lerna init

# 建立專案中的 packages
lerna create @pjchender/foo -y

# 進版
lerna version

# 會針對所有 packages
lerna run lint --stream --concurrency 1 # 一次只執行一個
lerna run test --stream # 一有 log 就顯示
lerna run build --parallel # 一有 log 就顯示且不管 concurrency 和 sort 的設定
lerna run watch --parallel

# 針對單一 package
lerna run --scope packages/foo build
lerna add --dev uuid packages/foo # 安裝套件到某一個 package 內

CLI

這裡的 packages 指的是 workspaces 內正在開發的專案:

$ lerna list      # 列出所有 workspaces 中的 packages,alias: ls

$ lerna add <pkg> [globs...] # 將該套件安裝到符合 globs 的所有 packages 中

$ lerna link # 將所有相關連 packages link 在一起
$ lerna bootstrap # 將所有 packages link 在一起,並安裝對應的 dependencies
$ lerna clean # 清除所有 packages 中的 node_modules 資料夾

$ lerna run <script> # 在所有 packages 中,執行有該 script 的指令
$ lerna exec [cmd] [args...] # 在所有 packages 中執行該指令

建立 workspaces 中的 packages

lerna create <name>

概念

stream 和 parallel 的差異

在執行 lerna run 的時候,lerna 預設會使用 4 個 processes 在執行(可以透過 --parallel 來自行調整),最後則會根據不同的 package 將 log 呈現出來,也就是程式執行的時候是同時執行,但 log 訊息是最後才根據 package 顯示出來。

lerna run without stream

如果使用了 --stream,這些對應了 log 訊息則不會在最後程式執行完後才顯示,而是程式跑到哪出現訊息時,就直接把訊息呈現出來,因此會看到不同 package 的 log 訊息交替出現。

但如果使用的是 lerna run lint --stream --concurrency 1,指的則會是一次只用一個 process 來執行,並且一有訊息就顯示出來,因此一次只會看到一個 package 執行的 log 訊息,一個 package 跑完才會跑下一個。

lerna run with stream

--parallel--stream 很類似,log 訊息也會交替出現,但不同的是使用了 parallel 後,會完全不管 concurrency 和 sort 的設定,一般適合用在需要 watch 檔案一有變更就要重 build 的情況(例如,$ lerna run watch --parallel),但因為它會一次開出很多 subprocess,因此建議縮限使用此指令的 package。

搭配 yarn v1 的 workspace 使用

lerna.json 中:

  • 透過 npmClient 告知使用 yarn
  • 因為有用 yarn 的 workspaces 功能,所以 useWorkspaces: true
+++ lerna.json

{
"packages": ["packages/*"],
"version": "0.0.0",
+ "npmClient": "yarn",
+ "useWorkspaces": true,
+ "steam": true
}

針對 monorepos 中 package.json 設定要留意的地方

針對 mono-repo 中 package.json 要留意修改的地方(可參考這個 commit #2c6bef):

@@ -1,22 +1,24 @@
{
"name": "@mono-sandbox/a",
"version": "0.0.0",
"description": "> TODO: description",
"author": "aaronchen <aaron.chen@onedegree.hk>",
"homepage": "",
"license": "ISC",
- "main": "lib/a.js",
+ "main": "dist/index.cjs.js",
+ "module": "dist/index.esm.js",
"directories": {
"lib": "lib",
"test": "__tests__"
},
"files": [
- "lib"
+ "dist"
],
"publishConfig": {
"access": "public"
},
"scripts": {
"build": "rollup -c ../../rollup.config.js",
"test": "echo \"Error: run tests from root\" && exit 1"
}
}