跳至主要内容

缓存任务结果

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

反复重建和重新测试相同的代码成本很高。Lerna 使用计算缓存来避免重复构建相同的代码。

设置

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

提示

如果您没有 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 [existing outputs match the cache, left as is]

> [email protected] build
> rimraf dist && rollup --config


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

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

Lerna (powered by Nx) Successfully ran target test for project header (4ms)

Nx read the output from the cache instead of running the command for 1 out of 1 tasks.

从缓存中回放

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

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

header/
└── dist/ <-- this folder gets recreated

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

高级缓存

要更深入地了解缓存实现并微调存储库的缓存,请阅读缓存如何工作

本地计算缓存

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