缓存任务结果
在运行任务、缓存等方面,Lerna 和 Nx 可以互换使用。当我们说“Lerna 可以缓存构建”时,我们的意思是 Lerna 使用 Nx,而 Nx 可以缓存构建。
反复重建和重新测试相同的代码成本很高。Lerna 使用计算缓存来避免重复构建相同的代码。
设置
通过 Nx 使用 Lerna 拥有最复杂且经过实战检验的计算缓存系统。它知道您即将运行的任务是否之前已经执行过,因此它可以使用缓存来恢复运行该任务的结果。
如果您没有 nx.json
,请运行 npx lerna add-caching
。
要为 build
和 test
启用缓存,请编辑 nx.json
中的 targetDefaults
属性以包含 build
和 test
任务
{
"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 将在下一次尝试访问它时创建一个新的缓存。