跳到主要内容

缓存任务结果

在运行任务、缓存等方面,Lerna 和 Nx 可以互换使用。当我们说"Lerna 可以缓存构建"时,我们的意思是 Lerna 使用 Nx 来缓存构建。

反复重新构建和重新测试相同的代码是昂贵的。Lerna 使用计算缓存来确保永远不会两次重建相同的代码。

设置

Lerna 通过 Nx 拥有最复杂和经过实战检验的计算缓存系统。它知道您即将运行的任务是否已执行过,因此可以使用缓存来恢复运行该任务的结果。

提示

如果您没有 nx.json,请运行 npx lerna add-caching

要为 buildtest 启用缓存,请编辑 nx.json 中的 targetDefaults 属性以包含 buildtest 任务:

nx.json
{
"targetDefaults": {
"build": {
"cache": true
},
"test": {
"cache": true
}
}
}
信息

请注意,可缓存的操作需要是无副作用的,这意味着给定相同的输入,它们应始终产生相同的输出。例如,命中后端 API 的端到端测试运行无法缓存,因为后端可能会影响测试运行的结果。

现在,运行以下命令两次。第二次操作将是即时的:

lerna run build --scope=header
终端输出
> lerna run build --scope=header

> header:build [现有输出与缓存匹配,保持不变]

> header@0.0.0 build
> rimraf dist && rollup --config


src/index.tsx → dist...
created dist in 858ms

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

Lerna(由 Nx 提供支持) 成功为项目 header 运行目标测试(4ms)

Nx 从缓存中读取输出,而不是为 1 个任务中的 1 个运行命令。

从缓存重放

当 Lerna 确定任务的输入未更改时,它会重新创建该任务的输出,就像它实际在您的机器上运行一样 - 但速度更快。缓存任务的输出包括终端输出和在该任务的已定义 output 目录中创建的文件。

您可以通过删除 header:build 任务输出的 dist 文件夹,然后再次运行 lerna run build --scope=header 来测试这一点。缓存的任务将立即重放,并且 dist 文件夹中将出现正确的文件。

header/
└── dist/ <-- 此文件夹将被重新创建

如果您的任务在不同位置创建输出工件,您可以更改缓存的输出文件夹。您还可以自定义哪些输入将在更改时使缓存失效。

高级缓存

要深入了解缓存实现并为您的仓库微调缓存,请阅读缓存工作原理

本地计算缓存

默认情况下,Lerna(通过 Nx)使用本地计算缓存。Nx 仅将缓存值存储一周,之后它们将被删除。要清除缓存,请运行 nx reset,Nx 将在下次尝试访问时创建一个新的缓存。