运行任务

Turborepo 通过自动并行化和缓存任务来优化你仓库中的开发者工作流程。一旦任务turbo.json 中注册,你就拥有了一套强大的工具来运行仓库中的脚本:

通过 turbo 运行任务很强大,因为你可以在开发和 CI 流水线中使用一个模型来执行整个仓库的工作流程。

package.json 中使用 scripts

对于经常运行的任务,你可以直接将 turbo 命令写入根目录的 package.json

./package.json
{
  "scripts": {
    "dev": "turbo run dev",
    "build": "turbo run build",
    "test": "turbo run test",
    "lint": "turbo run lint"
  }
}

Good to know: 

turboturbo run 的别名 - 但我们建议在 package.json 和 CI 工作流中使用 turbo run,以避免与将来可能添加的 turbo 子命令发生潜在冲突。

然后可以使用你的包管理器运行这些脚本。

Terminal
npm run dev

你只应该在根目录的 package.json 中写入 turbo 命令。在包的 package.json 中写入 turbo 命令可能会导致递归调用 turbo

使用全局 turbo

全局安装 turbo 让你可以直接从终端运行命令。这改善了你的本地开发体验,因为它使你更容易在需要时运行所需的内容。

此外,全局 turbo 在你的 CI 流水线中很有用,让你能够完全控制在流水线的每个点运行哪些任务。

自动包作用域

当你在包的目录中时,turbo 会自动将命令限定在该包的包图范围内。这意味着你可以快速编写命令,而不必编写过滤器来指定包。

Terminal
cd apps/docs
turbo build

在上面的示例中,turbo build 命令将使用 turbo.json 中注册的 build 任务为 docs 包运行 build 任务。

Good to know: 

使用过滤器 将覆盖自动包作用域。

自定义行为

run 子命令的文档中,你会找到许多有用的标志来根据需要调整 turbo run 的行为。当运行全局 turbo 时,你可以使用以下工作流程更快地工作:

  • 最常用命令的变体package.json 中的 build 脚本在它是 turbo build 时最有用 - 但你可能此时只对特定包感兴趣。你可以使用 turbo build --filter=@repo/ui 快速过滤出你感兴趣的特定包。
  • 一次性命令:像 turbo build --dry 这样的命令不经常需要,所以你可能不会在 package.json 中为它创建脚本。相反,你可以在需要时直接在终端中运行它。
  • 覆盖 turbo.json 配置:一些 CLI 标志在 turbo.json 中有等效的配置,你可以覆盖它。例如,你可能有一个配置为在 turbo.json 中使用 "outputLogs": "full"turbo build 命令 - 但你此时只对查看错误感兴趣。使用全局 turbo,你可以使用 turbo lint --output-logs=errors-only 只显示错误。

运行多个任务

turbo 能够运行多个任务,并在可能的情况下并行化。

Terminal
turbo run build test lint check-types

这个命令将运行所有任务,根据你的任务定义自动检测在哪里可以尽早运行脚本。

任务的顺序

turbo test lint 将与 turbo lint test 完全相同地运行任务。

如果你想确保一个任务阻塞另一个任务的执行,请在你的 任务配置 中表达这种关系。

使用过滤器

虽然缓存通过确保永远不会重复相同的工作来保持速度,但你也可以过滤任务以仅运行任务图的子集。

--filter API 参考中有许多高级过滤用例,但下面讨论最常见的用例。

按包过滤

按包过滤是一种简单的方法,只运行你当前正在处理的包的任务。

Terminal
turbo build --filter=@acme/web

你也可以直接在 CLI 命令中过滤到包的特定任务,而不需要使用 --filter

Terminal
# 运行 `web` 包的 `build` 任务
turbo run web#build
 
# 运行 `web` 包的 `build` 任务,以及 `docs` 包的 `lint` 任务
turbo run web#build docs#lint

按目录过滤

你的仓库可能有一个将相关包分组在一起的目录结构。在这种情况下,你可以使用该目录的通配符来让 turbo 专注于这些包。

Terminal
turbo lint --filter="./packages/utilities/*"

过滤以包含依赖项

当你在处理特定包时,你可能想要运行该包及其依赖项的任务。当你对包进行更改并想确保这些更改不会破坏其任何依赖项时,... 微语法很有用。

Terminal
turbo build --filter=...ui

过滤以包含依赖

要将范围限制在包及其依赖项上,在包名后附加 ...。这将为指定的包及其所有依赖包运行任务。

Terminal
turbo dev --filter=web...

按源代码控制更改过滤

使用过滤器根据源代码控制中的更改运行任务是一种很好的方法,只为受你的更改影响的包运行任务。源代码控制过滤器必须用 [] 包裹

  • 与上一次提交比较turbo build --filter=[HEAD^1]
  • 与主分支比较turbo build --filter=[main...my-feature]
  • 使用 SHA 比较特定提交turbo build --filter=[a1b2c3d...e4f5g6h]
  • 使用分支名称比较特定提交turbo build --filter=[your-feature...my-feature]

通常,你可以依靠缓存来保持你的仓库速度。当你使用 远程缓存 时,你可以依赖未更改的包命中缓存。

组合过滤器

为了更加具体,你可以组合过滤器来进一步细化你的任务图的入口点。

Terminal
turbo build --filter=...ui --filter={./packages/*} --filter=[HEAD^1]

多个过滤器作为并集组合,这意味着任务图将包含匹配任何过滤器的任务。有关过滤器高级用法的更多信息,请参见--filter API 参考

下一步

当你开始在仓库中运行任务时,你可能会开始注意到你的任务变得更快。接下来,你将探索缓存以及 turbo 如何确保你永远不会重复相同的工作。