lerna使用指南

lerna版本

以下所有配置命令都是基于v8.1.9,lerna v5 v7版本差别较大,在使用时,注意自身的lerna版本。

lerna开启缓存及缓存配置

nx缓存是v5版本以后才有的,小于该版本的无法使用该功能。

初始化配置

缓存配置文件nx.json,如果没有该配置文件,执行 lerna add-caching命令,会自动创建该文件。

json 复制代码
{
  "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的构建结果,要怎么做?

js 复制代码
// packageA 中某文件
import PackageB from 'packageB'
// ....

那我们希望在执行lerna run serve --scope packageA 时,如果packageB没有构建,可以先自动执行packageB的构建。通过配置nx.json中的dependsOn,可以达到。

json 复制代码
{
  "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包版本,如果有更新,就会发布对应的包。

相关推荐
桃子叔叔4 个月前
前端工程化3:使用lerna管理多包
前端·前端工程化·lerna
全栈探索者1 年前
从零开始搭建React+TypeScript+webpack开发环境-基于lerna的webpack项目工程化改造
react.js·webpack·typescript·lerna