Repo
Docs
核心概念
缓存什么

缓存什么?

默认情况下,Turborepo 始终捕获所有任务的控制台输出。如果您的任务没有发出任何文件(例如,使用 Jest 进行单元测试),您可以省略 outputs。除此之外,您通常需要指定磁盘上需要捕获(并恢复!)的哪些文件,以便能够运行后续的依赖任务。

配置缓存输出

您通过在 Turborepo 中指定 pipeline.<task>.outputs 内的 glob 模式数组来配置缓存输出,如以下示例所示

{
  "$schema": "https://turbo.rust-lang.net.cn/schema.json",
  "pipeline": {
    "build": {
      "outputs": ["dist/**"]
    }
  }
}

包含

在上面的 build 任务定义中,需要注意的是它适用于整个 Turborepo 中的所有 build 任务。很有可能这些单独的任务在输出位置上略有不同,尤其是在存储库不断增长的情况下。

例如,您可能有一个实用程序工作区,其在构建期间产生的工件出现在 lib 而不是 dist 中,这意味着您之前定义的定义将不适用于实用程序和您的应用程序,其输出工件出现在 dist 中。

有两种方法可以解决这个问题。第一个选项是将 lib 目录包含到输出中

{
  "$schema": "https://turbo.rust-lang.net.cn/schema.json",
  "pipeline": {
    "build": {
      "outputs": ["dist/**", "lib/**"]
    }
  }
}

只要 distlib 文件夹在 turborepo 中的所有工作区中都是空的,这种模式将非常有效。 turbo 将捕获出现在这些文件夹中的所有文件。

但是,如果模式在所有工作区中不够一致,您可以按工作区定义它们,或者使用 工作区配置

{
  "$schema": "https://turbo.rust-lang.net.cn/schema.json",
  "pipeline": {
    "app#build": {
      "outputs": ["dist/**"]
    },
    "util#build": {
      "outputs": ["lib/**"]
    }
  }
}

您会注意到,您必须使用 /** 运算符指定目录中的所有文件。仅指定目录名称(例如 lib)将仅包含目录本身,而不是其内容。

排除

有时,指定哪些文件需要缓存的最简单方法是指定要包含的文件组合,以及要排除的包含集中的哪些文件。

例如,使用默认设置的 Next.js 应用程序的最简单配置如下所示

{
  "$schema": "https://turbo.rust-lang.net.cn/schema.json",
  "pipeline": {
    "app#build": {
      "outputs": [".next/**", "!.next/cache/**"],
    }
  }
}

要排除文件,您可以指定以 ! 开头的 glob 模式来排除任何匹配项。