仓库
文档
核心概念
远程缓存

远程缓存

Turborepo 的 任务缓存 可以通过避免重复工作来节省大量时间。

但有一个问题 - 缓存是本地于您的机器的。当您使用 CI 时,这会导致大量重复工作:

由于 Turborepo 默认情况下只缓存到本地文件系统,因此相同任务(turbo run build)必须在每台机器上重新执行(由您、您的团队成员、您的 CI、您的 PaaS 等),即使所有任务输入都相同 - 这会浪费时间和资源

一个共享的缓存

如果您可以与整个团队(甚至您的 CI)共享一个 Turborepo 缓存,那会怎么样?

通过与 Vercel 等提供商合作,Turborepo 可以安全地与远程缓存通信 - 一个存储任务结果的云服务器。

这可以通过防止整个组织的重复工作来节省大量时间。

远程缓存是 Turborepo 的一项强大功能,但能力越大,责任越大。请确保您首先正确缓存,并仔细检查环境变量的处理。请记住,Turborepo 将日志视为工件,因此请注意您在控制台中打印的内容。

Vercel

用于本地开发

如果您想将本地 turborepo 链接到您的远程缓存,请首先使用您的 Vercel 帐户对 Turborepo CLI 进行身份验证

turbo login

如果您的远程缓存配置为使用单点登录,您需要运行 npx turbo login --sso-team=TEAMNAME 以获取具有正确权限的缓存令牌。

接下来,将您的 Turborepo 链接到您的远程缓存

turbo link

启用后,对您当前正在缓存的工作区进行一些更改,并使用 turbo run 对其运行任务。您的缓存工件现在将存储在本地您的远程缓存中。

要进行验证,请使用以下命令删除本地 Turborepo 缓存:

rm -rf ./node_modules/.cache/turbo

然后再次运行相同的构建。如果一切正常,turbo 不应该在本地执行任务,而是从您的远程缓存下载日志和工件,并将它们回放给您。

Vercel 构建中的远程缓存

如果您在 Vercel 上构建和托管您的应用程序,一旦您使用 turbo,远程缓存将自动为您设置。您需要更新您的 构建设置 (在新标签页打开) 以使用 turbo 进行构建。

有关更多信息,请参阅 Vercel 文档 (在新标签页打开)

工件完整性和真实性验证

您可以启用 Turborepo 在将工件上传到远程缓存之前使用密钥对其进行签名。Turborepo 使用 HMAC-SHA256 签名对工件进行签名,使用您提供的密钥。Turborepo 将在下载远程缓存工件时验证其完整性和真实性。任何无法验证的工件将被忽略,并被 Turborepo 视为缓存未命中。

要启用此功能,请将 remoteCache 选项添加到您的 turbo.json 配置文件中,并包含 signature: true。然后通过声明 TURBO_REMOTE_CACHE_SIGNATURE_KEY 环境变量来指定您的密钥。

{
  "$schema": "https://turbo.rust-lang.net.cn/schema.json",
  "remoteCache": {
    // Indicates if signature verification is enabled.
    "signature": true
  }
}

远程缓存 API

远程缓存可以由任何满足 Turborepo 远程缓存 API 规范的 HTTP 服务器实现。

使用 Vercel 的托管远程缓存

Vercel (opens in a new tab),Turborepo 的创建者和维护者,提供了一个与 Turborepo 完全兼容的托管远程缓存。

使用 Vercel 远程缓存 (opens in a new tab) 是零配置的,并通过开源的 Vercel 远程缓存 SDK (opens in a new tab) 自动集成到 Vercel 部署 (opens in a new tab) 中。

了解更多关于 Vercel 上的 Turborepo (opens in a new tab)免费部署模板 (opens in a new tab) 以试用它。

自托管

您也可以自托管自己的远程缓存,并通过指定 --api--token 标志来设置远程缓存域,其中 --api 是主机名,而 --token 是一个承载令牌。

turbo run build --api="https://my-server.example.com" --token="xxxxxxxxxxxxxxxxx"

您可以 在此处找到 API 的 OpenAPI 规范。目前,所有版本的 turbo 都与 v8 端点兼容。