目前 Lerna.js 提供了 17 个命令,根据他们使用的频率,下面整理出了这些命令的用法及相关说明。
lerna init
该命令用于创建一个由 lerna 管理的仓库,或者将现有仓库的 lerna 更新到最新版本。用法如下:
$ lerna init
当执行上面命令式,lerna 会做以下 3 件事:
- 当
package.json
文件中没有 lerna 依赖时,会将 lerna 添加到devDependencies
; - 在项目根目录创建一个 lerna 配置文件
lerna.json
,并将项目的版本号version
保存在lerna.json
配置文件中; - 当
.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-core
、prefix-utils
、prefix-components
和 services
四个软件包,而我们想要在所有以 prefix-
开头的软件包中安装 babel-core
,可执行下面的命令:
$ lerna add babel-core packages/prefix-*
这样,就能在所有以 prefix-
开头的软件包中安装 babel-core
依赖了。
lerna add
提供的 --dev
、--exact
和 --peer
则一一对应着 devDependencies
、dependencies
和 peerDependencies
。比如:
$ 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
需要注意的是,当项目中软件包之间没有引用关系时,执行这条命令是没有作用的。只有软件包之间有引用关系,才能使用该命令建立软件包的软链接。
假如项目中有 core
和 utils
两个软件包,其中 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
当执行这条命令后,会做以下操作:
- 执行
npm install
安装每个软件包的外部依赖(可在lerna.json
配置文件中指定npmClient
参数为npm
、yarn
或pnpm
); - 将有引用关系的软件包链接在一起;
- npm 在所有引导包中执行
prepublish
操作,除非传递了--ignore-prepublish
参数; - 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 了。在此过程中需要注意以下几点:
- 发布软件包前,项目不应有内容未提交,即应执行过
git commit
操作; - 要发布软件包,项目根目录必须存在
LICENSE.md
许可证文件; - 要发布的软件包版本不能与已发布的软件包版本相同;
- 发布之前应已在终端登录了 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 项目中,我们一般这样来管理:
- 对于一个新项目而言,我们可以使用
lerna init
来初始化项目。而对于一个已经存在 Lerna 项目,在从代码库将其克隆到本地后,我们可以执行lerna bootstrap
命令。 - 初始化项目后,就可以正式开发了。之后使用
lerna create
命令来创建软件包。 - 在开发软件包的过程中,我们肯定会用到第三方依赖,这是就可以用
lerna add
命令来安装依赖。 - 或许本地的多个软件包之间还会有相互饮用关系,这时就要用到
lerna link
命令了。 - 而要执行一些命令等,可以用
lerna exec
或lerna run
命令来实现。 - 当我们开发完一个小功能准备提交时,可以用
lerna diff
或lerna changed
等命令来查看项目的变更等信息。 - 当提交变更后,就要发布软件包到 npm 了,要发布软件包就离不开
lerna publish
命令。此时可以执行修改版本号、打 tag 等操作。
在上面步骤中,涉及到的 lerna 命令肯定要熟练掌握,其他没有提到的命令在开发过程中也会频繁的使用到。因此,先在本地项目中多实操几次,完成几个 demo 项目的闭环操作,在真实项目中遇到问题后才能游刃有余。
祝大家在繁忙的开发工作中永无 bug,天天准点下班哦 ^_^
3 comments
看看评论
测试一下评论功能
看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!