缓存什么?
默认情况下,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/**"]
}
}
}
只要 dist
和 lib
文件夹在 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 模式来排除任何匹配项。