目前 Lerna.js 提供了 17 个命令,根据他们使用的频率,下面整理出了这些命令的用法及相关说明。

lerna init

该命令用于创建一个由 lerna 管理的仓库,或者将现有仓库的 lerna 更新到最新版本。用法如下:

$ lerna init

当执行上面命令式,lerna 会做以下 3 件事:

  1. package.json 文件中没有 lerna 依赖时,会将 lerna 添加到 devDependencies
  2. 在项目根目录创建一个 lerna 配置文件 lerna.json,并将项目的版本号 version 保存在 lerna.json 配置文件中;
  3. .gitignore 文件不存在时,会在项目根目录生成一个 .gitignore 文件。
$ lerna init
lerna info version v2.0.0
lerna info Updating package.json
lerna info Creating lerna.json
lerna success Initialized Lerna files

lerna create

该命令用于创建一个有 Lerna 管理的软件包,创建的软件包保存在项目根目录的 packages 文件夹内。用法如下:

$ lerna create <name> [loc]

上面的命令中,name 表示要创建的软件包名称,比如创建一个名叫 core 的软件包:

$ lerna create core

执行上面命令后,Lerna 会在终端提供一个可交互的命令行界面,用来填写、完善该软件包的相关信息,如包名、版本号、软件包描述等。执行该命令后,默认会在 packages 文件夹内创建一个名为 core 的软件包。而后面的 loc 参数则允许我们自定义创建的软件包的位置,通常情况下用不到这个参数。

lerna add

该命令用来在软件包中安装依赖。可以在所有软件包中安装同一个依赖,也可以在指定的软件包中安装依赖。用法如下:

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

package 参数就是我们要添加的依赖,比如要在软件包中安装 babel-core 依赖,可以执行以下命令:

$ lerna add babel-core

上面的命令执行成功后,会在项目的所有软件包中安装 babel-core 依赖。如果只想在某一个软件包中安装 babel-core,可执行以下命令:

$ lerna add babel-core packages/core

上面命令后面的 packages/core 参数表示要在软件包 core 中安装 babel-core 依赖,项目的其他软件包中则不会安装该依赖。

当我们想要在某一类软件包中安装 babel-core 时该怎么做呢?比如项目中现在有 prefix-coreprefix-utilsprefix-componentsservices 四个软件包,而我们想要在所有以 prefix- 开头的软件包中安装 babel-core,可执行下面的命令:

$ lerna add babel-core packages/prefix-*

这样,就能在所有以 prefix- 开头的软件包中安装 babel-core 依赖了。

lerna add 提供的 --dev--exact--peer 则一一对应着 devDependenciesdependenciespeerDependencies。比如:

$ lerna add babel-core --scope=core --dev

注意上面的 --scope 参数,这里表示要在指定的软件包中安装 babel-core,它的值是对应软件包中 package.json 文件中的 name 的值,而不是软件包的文件夹名。比如 core 软件包中 package.json 中的 name@smpower-cli-dev/core,那么这条命令应该这样写:

$ lerna add babel-core --scope=@smpower-cli-dev/core --dev

而不能写成:

$ lerna add babel-core --scope=core --dev

lerna link

该命令用来管理 Lerna 项目中所有软件包之间的软链接,它的作用和 npm link 的功能是一样的,不过要比 npm link 更易用、管理软连接也更加方便。用法如下:

$ lerna link

需要注意的是,当项目中软件包之间没有引用关系时,执行这条命令是没有作用的。只有软件包之间有引用关系,才能使用该命令建立软件包的软链接。

假如项目中有 coreutils 两个软件包,其中 core 软件包引用本地的 utils 软件包,那么执行 lerna link 后,core 软件包的 package.json 文件中就会有 utils 软件包的依赖,这时就建立了 utils 的软连接。

lerna clean

该指令可以从 Lerna 管理的项目中移除所有软件包中的 node_modules 文件夹。用法如下:

$ lerna clean

lerna clean 不会移除项目根目录中的 node_modules 文件夹,只会删除软件包下的 node_modules 文件夹。

lerna bootstrap

这条命令的作用是将本地有引用关系的软件包链接在一起,并安装剩余软件包的第三方依赖。用法如下:

$ lerna bootstrap

当执行这条命令后,会做以下操作:

  1. 执行 npm install 安装每个软件包的外部依赖(可在 lerna.json 配置文件中指定 npmClient 参数为 npmyarnpnpm);
  2. 将有引用关系的软件包链接在一起;
  3. npm 在所有引导包中执行 prepublish 操作,除非传递了 --ignore-prepublish 参数;
  4. npm 在所有引导包中执行 prepare 操作。

lerna exec

该指令可在每个软件包中执行任意命令。用法如下:

$ lerna exec -- <command> [..args] # runs the command in all packages

在实用该命令时,要注意后面跟两个中横线 --,之后接要执行的命令。该命令能极大地提升效率,尤其是在每个软件包中执行同一个操作时,比如要删除每个软件包下的 node_modules 文件夹,可执行以下命令:

$ lerna exec -- rm -rf ./node_modules

除此之外,还能对指定的软件包执行特定操作,比如要查看软件包 core 下的所有文件:

$ lerna exec --scope core -- ls
info cli using local version of lerna
lerna notice cli v6.0.3
lerna notice filter including "core"
lerna info filter [ 'core' ]
lerna info Executing command in 1 package: "ls"
__tests__  lib  package.json  README.md
lerna success exec Executed command in 1 package: "ls"

指定软件包时要用到 --scope 参数,表示要在该软件包下执行某一命令。--scope 参数后提供的软件包名称为 package.json 文件中的 name 字段的值,而非软件包所在的文件夹名称,这是需要注意的。

lerna run

该命令会执行每个软件包下的 npm 脚本(只有软件包下存在 npm 脚本时才会执行)。用法如下:

$ lerna run <script> -- [..args] # runs npm run my-script in all packages that have it

假如在每个软件包下都有一个 build npm 脚本,那么要执行这些软件包中的 build 命令就可以这样做:

$ lerna run build

除此之外,lerna run 还能执行指定软件包的 npm 脚本命令。比如要执行 core 软件包中的 test 脚本命令:

$ lerna run --scope core test
info cli using local version of lerna
lerna notice cli v6.0.3
lerna notice filter including "core"
lerna info filter [ 'core' ]

> core:test

yarn run v1.22.17
$ node ./__tests__/core.test.js
core tests passed
Done in 0.18s.

 —————————————————————————————————————————————————————————————————————————————————————————————————

 >  Lerna (powered by Nx)   Successfully ran target test for project @smpower-cli-dev/core (963ms)

lerna changed

该命令列出自上次发布软件包以来有哪些软件包存在变更,可以非常方便的查看本次要发布的软件包有哪些。用法如下:

$ lerna changed
info cli using local version of lerna
lerna notice cli v6.0.3
lerna info Assuming all packages changed
@smpower-cli-dev/core
@smpower-cli-dev/utils
lerna success found 2 packages ready to publish

可以看到,自上次发布软件包后,本次有 2 个软件包要发布,它们分别是:@smpower-cli-dev/core@smpower-cli-dev/utils

lerna diff

该命令用于查看自上次发布以来的软件包的变更,可以查看所有软件包的变更,也可查看指定软件包的变更。表现上类似于 git diff。用法如下:

$ lerna diff # 查看所有软件包的变更

要查看指定软件包的变更,执行以下命令:

$ lerna diff [package]

package 参数指的就是软件包名称,如 lerna diff core。需要注意的是,软件包名称取 package.json 文件中 name 字段的值,而非软件包所在文件夹的名称。

lerna version

该命令的作用是给项目的各个软件包打上版本号。执行该命令后,它会在终端提供一个可交互的命令行界面,可根据需要选择哪一种版本号。如果自上次发布以来没有任何变更,该命令则不会执行任何操作,只有当软件包内容变更并提交后,才能选择/输入一个新的版本号。示例如下:

$ lerna version
info cli using local version of lerna
lerna notice cli v6.0.3
lerna info current version 1.0.4
lerna info Looking for changed packages since v1.0.4
? Select a new version (currently 1.0.4) (Use arrow keys)
❯ Patch (1.0.5) 
  Minor (1.1.0) 
  Major (2.0.0) 
  Prepatch (1.0.5-alpha.0) 
  Preminor (1.1.0-alpha.0) 
  Premajor (2.0.0-alpha.0) 
  Custom Prerelease 
  Custom Version 

也可以直接执行版本号,如:

$ lerna version patch
info cli using local version of lerna
lerna notice cli v6.0.3
lerna info current version 1.0.4
lerna info Looking for changed packages since v1.0.4

Changes:
 - @smpower-cli-dev/core: 1.0.4 => 1.0.5

? Are you sure you want to create these versions? (ynH)

lerna version patch 的效果同 lerna version 命令执行后选择 Pathc 项的效果是相同的,同样是在当前版本号后增加一个小版本号。

lerna version 后的参数有 [major | minor | patch | premajor | preminor | prepatch | prerelease]

lerna publish

该命令会将软件包发布到 npm。用法如下:

$ lerna publish
info cli using local version of lerna
lerna notice cli v6.0.3
lerna info current version 1.0.4
lerna info Looking for changed packages since v1.0.4
? Select a new version (currently 1.0.4) (Use arrow keys)
❯ Patch (1.0.5) 
  Minor (1.1.0) 
  Major (2.0.0) 
  Prepatch (1.0.5-alpha.0) 
  Preminor (1.1.0-alpha.0) 
  Premajor (2.0.0-alpha.0) 
  Custom Prerelease 
  Custom Version 

假如选择了 Patch (1.0.5) 选项,交互式命令行界面会再次确认我们是否要发布这些软件包:

$ lerna publish
info cli using local version of lerna
lerna notice cli v6.0.3
lerna info current version 1.0.4
lerna info Looking for changed packages since v1.0.4
? Select a new version (currently 1.0.4) Patch (1.0.5)

Changes:
 - @smpower-cli-dev/core: 1.0.4 => 1.0.5

? Are you sure you want to publish these packages? (ynH) 

输入 y 并轻按键盘回车键确认发布:

$ lerna publish
info cli using local version of lerna
lerna notice cli v6.0.3
lerna info current version 1.0.4
lerna info Looking for changed packages since v1.0.4
? Select a new version (currently 1.0.4) Patch (1.0.5)

Changes:
 - @smpower-cli-dev/core: 1.0.4 => 1.0.5

? Are you sure you want to publish these packages? Yes
lerna info execute Skipping releases
lerna info git Pushing tags...
lerna info publish Publishing packages to npm...
lerna success published @smpower-cli-dev/core 1.0.5
lerna notice 
lerna notice 📦  @smpower-cli-dev/core@1.0.5
lerna notice === Tarball Contents === 
lerna notice 70B  bin/index.js
lerna notice 89B  lib/index.js
lerna notice 765B package.json
lerna notice 746B LICENSE.md  
lerna notice 105B README.md   
lerna notice === Tarball Details === 
lerna notice name:          @smpower-cli-dev/core   
lerna notice version:       1.0.5   
lerna notice filename:      smpower-cli-dev-core-1.0.5.tgz  
lerna notice package size:  1.2 kB  
lerna notice unpacked size: 1.8 kB  
lerna notice shasum:        4b52fad4b489061c9949914aa140269f94e2e9e9
lerna notice integrity:     sha512-OBoHCMpAt/65T[...]2xbQUXH4E0fqQ==
lerna notice total files:   5   
lerna notice 
Successfully published:
 - @smpower-cli-dev/core@1.0.5
lerna success published 1 package

当看到最后的 lerna success published 1 package 时表示项目中的软件包已发布到 npm 了。在此过程中需要注意以下几点:

  1. 发布软件包前,项目不应有内容未提交,即应执行过 git commit 操作;
  2. 要发布软件包,项目根目录必须存在 LICENSE.md 许可证文件;
  3. 要发布的软件包版本不能与已发布的软件包版本相同;
  4. 发布之前应已在终端登录了 npm,如未登录则需执行 npm login 登录到 npm。

lerna list

该命令会将本地项目中的所有软件包列出来。用法如下:

$ lerna list
info cli using local version of lerna
lerna notice cli v6.0.3
@smpower-cli-dev/core
@smpower-cli-dev/utils
lerna success found 2 packages

lerna info

该命令会在终端将环境信息打印出来,用法如下:

$ lerna info
info cli using local version of lerna
lerna notice cli v6.0.3

 Environment info:

  System:
    OS: Linux 5.10 Debian GNU/Linux 11 (bullseye) 11 (bullseye)
    CPU: (2) x64 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz
  Binaries:
    Node: 18.12.1 - ~/.nvm/versions/node/v18.12.1/bin/node
    Yarn: 1.22.19 - ~/.nvm/versions/node/v18.12.1/bin/yarn
    npm: 8.19.2 - ~/.nvm/versions/node/v18.12.1/bin/npm
  Utilities:
    Git: 2.30.2 - /usr/bin/git
  npmPackages:
    lerna: ^6.0.3 => 6.0.3

lerna repair

随着项目开发迭代,当我们把 lerna 从旧版本更新到较新的版本后,对应的配置文件也要做相应调整,而 lerna repair 命令就能帮我们自动更新其配置文件。更新 lerna 版本后可执行下面的命令将更新其配置文件:

$ npm i lerna@latest
$ lerna repair

lerna import

导入指定 git 仓库的包作为 lerna 管理的软件包:

$ lerna import <path-to-external-repository>

lerna caching

该命令可用来运行设置基本缓存选项的向导。用法如下:

$ lerna add-caching

以上是 Lerna.js 提供的 17 个脚手架命令,想要较为熟练的掌握这些命令离不开项目实践,建议不熟悉这些命令的小伙伴们在本地创建几个 demo 搞几遍。

在一个 Lerna 项目中,我们一般这样来管理:

  1. 对于一个新项目而言,我们可以使用 lerna init 来初始化项目。而对于一个已经存在 Lerna 项目,在从代码库将其克隆到本地后,我们可以执行 lerna bootstrap 命令。
  2. 初始化项目后,就可以正式开发了。之后使用 lerna create 命令来创建软件包。
  3. 在开发软件包的过程中,我们肯定会用到第三方依赖,这是就可以用 lerna add 命令来安装依赖。
  4. 或许本地的多个软件包之间还会有相互饮用关系,这时就要用到 lerna link 命令了。
  5. 而要执行一些命令等,可以用 lerna execlerna run 命令来实现。
  6. 当我们开发完一个小功能准备提交时,可以用 lerna difflerna changed 等命令来查看项目的变更等信息。
  7. 当提交变更后,就要发布软件包到 npm 了,要发布软件包就离不开 lerna publish 命令。此时可以执行修改版本号、打 tag 等操作。

在上面步骤中,涉及到的 lerna 命令肯定要熟练掌握,其他没有提到的命令在开发过程中也会频繁的使用到。因此,先在本地项目中多实操几次,完成几个 demo 项目的闭环操作,在真实项目中遇到问题后才能游刃有余。

祝大家在繁忙的开发工作中永无 bug,天天准点下班哦 ^_^

Last modification:November 24, 2022
如果觉得我的文章对你有用,请随意赞赏