lerna使用指南
lerna版本
以下所有配置命令都是基于v8.1.9
,lerna v5 v7版本差别较大,在使用时,注意自身的lerna版本。
lerna
开启缓存及缓存配置
nx
缓存是v5版本以后才有的,小于该版本的无法使用该功能。
初始化配置
缓存配置文件nx.json,如果没有该配置文件,执行 lerna add-caching
命令,会自动创建该文件。
{
"targetDefaults": {
"build": {
"cache": true,
"outputs": [
"{projectRoot}/lib"
]
}
}
需要对哪个执行脚本的输出结果进行缓存,就配置对应的命令。这里配置的是缓存build
命令的结果。默认缓存输出目录是dist,如果不同,需自定义output目录。其中{projectRoot}
为当前package的相对路径,不建议修改。如果需要整个工程目录,用{workspacesRoot}
缓存执行结果
当首次执行lerna run build --scope packageA
时,会缓存对应的终端输出结果,以及对应的构建结果文件。在项目根目录会生成.nx文件夹,里面cache子目录下会存放对应的缓存数据。执行结果缓存放在cache目录下一个随机数目录。
缓存生成以后,下次执行build
命令时,如果命中缓存,lerna不会实际执行npm脚本命令,而是从缓存中读取。
清除缓存
删除outputs对应目录下的文件,重新执行build
命令,也不能真正重新执行npm,而是从缓存中重新创建对应的输出文件。如果想要清除缓存结果,执行npx nx reset
控制执行方式
如果当前工作区中有多个package,packageA中执行serve
命令时,依赖packageB的构建结果,要怎么做?
// packageA 中某文件
import PackageB from 'packageB'
// ....
那我们希望在执行lerna run serve --scope packageA
时,如果packageB没有构建,可以先自动执行packageB的构建。通过配置nx.json
中的dependsOn
,可以达到。
{
"targetDefaults": {
"serve": {
"dependsOn": [
"^build"
]
}
}
^build
表示serve
命令,依赖于先执行依赖构建命令。如上面代码示例中,packageA中依赖了packageB,会优先执行packageB的build命令。
工程依赖
如果想查看当前工程下,各个包之间的依赖关系,执行npx nx graph
,可以查看包与包之间的依赖
发布包
Fixed: 固定包版本【默认】
lerna publish
当使用固定模式时,所有受影响的包将使用相同的版本发布。在单一版本号模式下运行,版本号在根目录lerna.json中。每次publish时,有更新的包会发布对应的version版本,如果包无更新,则不发布。如果主版本号是0开始,则每次会为所有子包发布新版本。
这样带来的一个问题是,当持续更新某一子包,而其他子包不更新时,Lerna将只对自上一个版本以来更改过的包进行版本和发布,这会导致包的版本随着时间的推移而漂移。
lerna publish --force-publish
可以解决版本漂移问题,强制为所有子包更新版本。
Independent: 独立包版本
npx lerna init --independent
独立模式Lerna项目允许维护者彼此独立地增加软件包版本。将lerna.json
中的version
设置为independent
,使其运行在independent模式
lerna publish from-package
会比较所有包的当前版本与已发布的npm包版本,如果有更新,就会发布对应的包。