Repo
Docs
核心概念
文件输入

文件输入

默认情况下,当工作区中的任何文件发生更改时,工作区被认为已更新。但是,并非整个仓库中的每个文件更改都应该导致重新运行任务。Turborepo 提供了工具,可以确保您可以定义每个重要的文件。

全局文件

几乎每个仓库都有一些配置出现在仓库的根目录。这些文件有可能影响子工作区的行为。

package.jsonturbo.json

默认情况下,Turborepo 将根目录 package.json 和根目录 turbo.json 文件包含在全局哈希中。您无需单独指定它们。

指定其他输入

如果存在应该被每个工作区考虑的其他文件,例如根目录 tsconfig.json,您应该在 globalDependencies 中指定它。

{
  "$schema": "https://turbo.rust-lang.net.cn/schema.json",
  "globalDependencies": ["tsconfig.json"],
  "pipeline": {
    "type-check": {}
  }
}

此自定义是添加到 Turborepo 对 package.jsonturbo.json 的默认行为。

在此示例中,当根目录 tsconfig.json 文件发生更改时,turborepo 中的每个任务都会重新运行。

工作区文件

除了出现在任何工作区之外的全局文件之外,您还可以指定每个工作区要包含哪些文件。

package.jsonturbo.json

每个工作区的 package.jsonturbo.json(如果存在)的内容会自动被视为工作区哈希。此行为不可配置。

Turborepo 的默认行为

Turborepo 的默认行为是检查仓库并识别哪些文件应该包含在哈希计算中。Turborepo 通常使用 Git 来识别要考虑的文件。

  • 出现在 Git 索引中且是工作区目录子目录的所有文件。
  • 所有未跟踪的文件,它们是工作区目录的子目录,并且没有被 .gitignore

如果 Git 不可用,或者仓库尚未设置,我们会尝试使用以下策略来近似出现在 Git 索引中的内容。

  • 包含所有作为工作区目录子目录的文件。
  • 排除出现在根目录 .gitignore 和工作区目录的 .gitignore 中的所有文件。

这两种方法并不总是产生相同的结果!在以下情况下,这不会产生相同的结果。

  • .gitignore 文件位于目录层次结构中的其他位置。
  • 添加到 Git 索引中的文件,这些文件也包含在 .gitignore 中。

您应该同时拥有 Git 和 Git 索引,以确保最大程度的正确性。

自定义行为

自定义 inputs 会立即退出默认行为。您必须通过 pipeline.<task>.inputs 手动指定所有应考虑的文件。

为了方便起见,您可以在输入数组中使用特殊字符串 $TURBO_DEFAULT$,以自动包含默认行为中考虑的所有文件。这使您无需手动指定默认情况下会考虑的所有文件即可自定义输入。

对于某些任务,减少进入任务哈希考虑的文件输入数量是值得的。很少有任务依赖于 README.md 的内容。仅指定相关文件可以提高缓存命中率。

例如,在许多 build 任务中,唯一可能重要的文件可能出现在 src 目录中。或者,一个 test 任务可能仅依赖于 srctest 目录中的文件。您可以使用传递给 pipeline.<task>.inputs 的 glob 模式来指定这一点。

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

这些 glob 模式相对于工作区路径,因此,对于 buildwebsite 应用程序中,它将把 /apps/website/src/** 视为文件输入,而对于 buildutils 工作区中,它将把 /packages/utils/src/** 视为文件输入。

如果一个任务依赖于另一个指定文件依赖项的任务,则无需再次列出它们。任务之间的依赖关系可用于确保满足所有文件依赖项。

{
  "$schema": "https://turbo.rust-lang.net.cn/schema.json",
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "inputs": ["src/**"]
    },
    "test": {
      // This task dependsOn build...
      "dependsOn": ["build"],
      // ...which means that it does not need to specify "src/**" here:
      "inputs": ["test/**"]
    }
  }
}

此模式可用于避免您需要为每个任务重复枚举文件 glob 列表。

您可能还想保留默认行为,但只包含或排除几个文件。您可以使用特殊字符串 $TURBO_DEFAULT$ 来包含默认情况下会考虑的所有文件。

{
  "$schema": "https://turbo.rust-lang.net.cn/schema.json",
  "pipeline": {
    "build": {
      "inputs": ["$TURBO_DEFAULT$", "!README.md", "a-git-ignored-file.txt"]
    }
  }
}