文件输入
默认情况下,当工作区中的任何文件发生更改时,工作区被认为已更新。但是,并非整个仓库中的每个文件更改都应该导致重新运行任务。Turborepo 提供了工具,可以确保您可以定义每个重要的文件。
全局文件
几乎每个仓库都有一些配置出现在仓库的根目录。这些文件有可能影响子工作区的行为。
package.json
和 turbo.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.json
和 turbo.json
的默认行为。
在此示例中,当根目录 tsconfig.json
文件发生更改时,turborepo 中的每个任务都会重新运行。
工作区文件
除了出现在任何工作区之外的全局文件之外,您还可以指定每个工作区要包含哪些文件。
package.json
和 turbo.json
每个工作区的 package.json
和 turbo.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
任务可能仅依赖于 src
和 test
目录中的文件。您可以使用传递给 pipeline.<task>.inputs
的 glob 模式来指定这一点。
{
"$schema": "https://turbo.rust-lang.net.cn/schema.json",
"pipeline": {
"build": {
"inputs": ["src/**"]
},
"test": {
"inputs": ["src/**", "test/**"]
}
}
}
这些 glob 模式相对于工作区路径,因此,对于 build
在 website
应用程序中,它将把 /apps/website/src/**
视为文件输入,而对于 build
在 utils
工作区中,它将把 /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"]
}
}
}