缓存还是不缓存
在构建 Monorepo 时,您需要针对每个任务决定是否可以根据之前运行过该任务来跳过该任务。此行为通过 pipeline.<task>.cache
在 turbo.json
中控制。
{
"$schema": "https://turbo.rust-lang.net.cn/schema.json",
"pipeline": {
"lint": {
"cache": true
}
}
}
Turborepo 默认设置为 "cache": true
,因此您无需指定此值,这意味着这是一个相同的配置。
{
"$schema": "https://turbo.rust-lang.net.cn/schema.json",
"pipeline": {
"lint": {}
}
}
在这些示例中,我们告诉 Turborepo 缓存 lint
任务。但是,由于我们只指定了 cache
键,因此唯一被缓存的是终端输出。对于某些类型的任务,例如 lint
或 test
,这种最小配置可能是正确的!
但是,对于大多数任务,您还需要指定 缓存什么,以及 文件 和 环境变量,这些变量必须匹配才能使缓存有效。
何时不缓存
"cache": false
并不意味着“始终运行!”。它意味着“如果要执行此任务,则不会从缓存中恢复它”。不要依赖 "cache": false
来触发部署等副作用。
由于缓存是默认行为,并且对于大多数情况来说都是理想的,因此了解何时选择退出此行为非常重要。
- 执行速度极快的任务。如果您打算使用远程缓存,并且任务可以在不到网络往返时间内执行,例如 100 毫秒,您应该考虑不缓存该任务。
- 输出资产非常大的任务。如果运行任务的结果是生成 Docker 容器,那么创建缓存工件、上传它以及下载它所花费的时间可能会超过重新生成它的时间。
- 非转换性文件系统操作。如果任务是“将一堆图像从一个目录移动到另一个目录”,则该任务可能需要一段时间,但本地执行该操作的过程始终比缓存和恢复已移动的资产更快。
- 实现了自己的应用程序行为感知缓存的任务。某些任务具有自己的内部缓存行为,例如,类似于 Docker 的层缓存。在大多数情况下,这些二级缓存与 Turborepo 协同工作,但在某些情况下,这种配置会变得非常复杂。
随着您对 Turborepo 的熟悉程度越来越高,您会发现这些指南中的一些在不同环境中执行时具有意想不到的权衡。例如,有时持续集成服务上的磁盘读取速度明显慢于网络读取速度。请务必在自己的项目中测试行为,以确定不缓存是否能带来性能优势。