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 prepublish
和npm 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
。 - 將新分支
push
到remote
端。 - 建立
pr
,並打上label
,此處一定要打上label
,learn-changelog
就是根據label
來確定該pr
屬於feature
/bugfix
/document
等。 - 切記要在
merge
之前打上label
。 - 進行
merge pr
操作。 - 本地切換到
master
分支並進行pull
操作。 - 執行
lerna-changelog
,既可得到一份changeling
。
注意
pr
的label
並不能隨意設定,一定要在專案中宣告對應才生效。
官方預設支援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
的使用已介紹完畢,上述內容可滿足日常開發需求,更多詳情還需參考官方文件。