Lerna
1 )文檔
- Lerna 文檔
- https://www.npmjs.com/package/lerna
- https://lerna.js.org [請直達這個鏈接]
- 使用 Lerna 幫助我們做包管理,并不復雜,中間常用的命令并不是很多
- 這里是命令直達:https://lerna.js.org/docs/api-reference/commands
2 )使用
- 現在我們開始使用 Lerna, 首先創建目錄 lerna
- 安裝并查看 lerna 版本 $
npx lerna -v
這里沒有安裝,會自動安裝 lerna - 目前lerna的版本是8.1.2
- 在 lerna 這個目錄下執行 $
npx lerna init
- 這時候,項目初始化完成了,就會多處一個 lerna.json 這個是lerna配置文件
- 現在基于 lerna 創建 a包 $
npx lerna create a
一路回車 - 現在出現了 packages/a 包,里面有一系列配置
- 同workspace使用一致,在使用a的時候,把a加到分組中, 修改 a/package.json中的name
"name":"@somegroup/lerna-a"
, 并且把 a/lib/a.js 修改成 a/lib/index.js- 同步 a/package.json 中
"main": "lib/index.js",
同時修改成ESM的形式"type":"module"
- 修改 a/lib/index.js 的代碼
'use strict';export default function() {return 'Hello from a'; }
- 這樣,a包就調試好了, 可以在 lerna/package.json 中看到
"workspaces": ["packages/*" ],
- 這里的worksapces 使用了通配符*的方式
- 不同于 npm的workspace添加依賴的方式,lerna提供的方式是:$
npx lerna add -h
- 注意,這里 The “add” command was removed by default in v7, and is no longer maintained.
- 所以,新提供的方式是: https://lerna.js.org/docs/legacy-package-management#replacing-your-usage-of-lerna-add
- 現在給a包添加chalk依賴: $
npm i chalk -w @somegroup/lerna-a
注意這里a包的name變化了,所以安裝方式也要如此 - 這里,a包就緒之后,就可以著手創建b包了,在創建的時候,可以看下一些輔助參數 $
npx lerna create -h
- 可以看到常用的有
--access When using a scope, set publishConfig.access value [可選值: "public", "restricted"] [默認值: public] --bin Package has an executable. Customize with --bin <executableName> [默認值: <name>] --es-module Initialize a transpiled ES Module [布爾]
- 這樣,在創建b包的時候,就可以這樣 $
npx lerna create b --access public
回車,注意name配置為:@somegroup/lerna-b - 創建 cli 包的時候,就可以這樣 $
npx lerna create cli --access public --bin --es-module
回車,注意name配置為:@somegroup/lerna-cli - 對于b包
- 修改 b/lib/b.js 為 b/lib/index.js, 同時修改 b/package.json 中的
"main": "lib/index.js"
和"type": "module"
- 注意,這里和 cli包的區別在于生成b包的時候
--es-module
沒有添加,所以要手動添加這個"type": "module"
- 注意,這里和 cli包的區別在于生成b包的時候
- 修改 b/lib/index.js 的內容
'use strict';export default function () {return 'Hello from b'; }
- 修改 b/lib/b.js 為 b/lib/index.js, 同時修改 b/package.json 中的
- 對于 cli 包
-
修改 cli/package.json 中的 bin屬性為:
"bin": { "lerna-cli": "bin/cli.js" }
, main屬性"main":"src/cli.js"
-
修改 cli/bin/cli.js 中
#!/usr/bin/env node'use strict';import cli from '../src/cli.js';cli().parse(process.argv.slice(2));
-
修改 src/cli.js
import factory from 'yargs/yargs';export default function cli(cwd) {const parser = factory(null, cwd);parser.alias('h', 'help');parser.alias('v', 'version');parser.usage("$0","TODO: description",yargs => {yargs.options({// TODO: options});});return parser; }
-
- 回到最外層 lerna 目錄,嘗試連接下:
npx lerna link
,發現報錯- 報錯內容為:The “link” command was removed by default in v7, and is no longer maintained.
- 解決方案:https://lerna.js.org/docs/legacy-package-management#replacing-your-usage-of-lerna-bootstraplerna-link
- 使用 $
npm i -ws
這樣,三個包都會在 lerna/node_modules/@somegroup 組中會被同步,這樣可以替代之前lerna的link命令npm i -ws
是更新所有 workspaces 中的依賴
- 現在在 lerna/package.json 中的最外層加上一個 cli 的 scripts
{"scripts": {"cli": "lerna-cli"} }
- 執行 $
npm run cli
- 這樣,cli 包就可以直接在 lerna 目錄下執行了, 驗證
- $
npm run cli -v
得到 10.2.3 這里得到的是 npm 的版本
- $
- 至此,基于 lerna 的腳手架的功能框架完成,目前并沒有提供什么實質的功能
- 現在,要在 cli 包中使用a包和b包,在 lerna 目錄下,執行 $
npm i @somegroup/lerna-a @somegroup/lerna-b -w packages/cli
- 在 lerna/packages/cli/bin/cli.js 中使用
#!/usr/bin/env node'use strict';import cli from '../src/cli.js'; import a from '@somegroup/lerna-a'; import b from '@somegroup/lerna-b';console.log(a()); console.log(b());cli().parse(process.argv.slice(2));
- 執行 cli,$
npm run cli
可以看到,打印出了a, b包中的方法提供的字符串

3 )測試
- 使用 lerna 添加測試腳本 $
npx lerna run test
它會把 packages 目錄中所有 test 腳本全部執行 - 如果要單獨測試某個包,比如a包,修改
packages/a/__tests__
目錄下的 a.test.js'use strict';import a from '../lib/index.js'; import assert from 'assert';const { strict } = assert;assert.strictEqual(a(), 'Hello from a'); console.info('a tests passed');
- 這時候,在 packages/a 下執行 $
npm run test
測試通過 - 同樣,packages/* 下的所有包都可以這樣修改后,執行測試用例
4 )發布
- 發布前的再次檢查
- 每個包的版本都要注意同步檢查,發布的時候,不要有錯誤
- 發布的配置檢查,在 package.json 中
"publishConfig": { "access": "public" }
都要有 - 提交代碼到遠程倉庫后(必須)
- 所有事項準備完成,就可以執行發布的流程了,執行 $
npx lerna publish
- 這里有步驟,可以選擇下一個版本,填入必要信息或選項
- 選擇之后,本地packages下包的每個版本都會幫忙升級,非常方便
5 )驗證
- 發布完成后,可以本機全局安裝我們的
@somegroup/lerna-cli
工具了 - $
npm i -g @somegroup/lerna-cli@latest
或者指定版本號 - 再執行 $
lerna-cli
就可以運行我們的腳手架了 - 這樣基于lerna開發的腳手架就已經完成了