Turborepo logo

运行任务

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"
  }
}

须知: 

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

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

终端
npm run dev

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

使用全局 turbo

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

此外,全局 turbo 在你的 CI 管道中也很有用,它可以让你最大限度地控制在管道的每个点运行哪些任务。

自动包作用域

当你在一个包的目录中时,turbo 将自动将命令的作用域限定为该包的包图。这意味着你可以快速编写命令,而无需为包编写过滤器

终端
cd apps/docs
turbo build

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

须知: 

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

自定义行为

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 build 命令以使用 turbo.json 中的 "outputLogs": "full" - 但你目前只对查看错误感兴趣。使用全局 turbo,你可以使用 turbo lint --output-logs=errors-only 仅显示错误。

运行多个任务

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

终端
turbo run build test lint check-types

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

任务排序

turbo test lint 将以与 turbo lint test 完全相同的方式运行任务。

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

使用过滤器

虽然 缓存 确保你永远不会重复工作,从而保持快速,但你也可以过滤任务,使其仅运行 任务图 的子集。

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

按包过滤

按包过滤是仅为你当前正在处理的包运行任务的简单方法。

终端
turbo build --filter=@acme/web

你还可以直接在 CLI 命令中为包过滤特定任务,而无需使用 --filter

终端
# Run the `build` task for the `web` package
turbo run web#build
 
# Run the `build` task for the `web` package, and the `lint` task for the `docs` package
turbo run web#build docs#lint

按目录过滤

你的仓库可能具有目录结构,其中相关的包组合在一起。在这种情况下,你可以捕获该目录的 glob,以将 turbo 聚焦在这些包上。

终端
turbo lint --filter="./packages/utilities/*"

过滤以包含依赖项

当你在处理特定包时,你可能想要为该包及其依赖项运行任务。当你更改包并希望确保更改不会破坏其任何依赖项时,... 微语法非常有用。

终端
turbo build --filter=...ui

过滤以包含依赖项

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

终端
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]

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

组合过滤器

为了获得更高的特异性,你可以组合过滤器以进一步优化进入你的 任务图 的入口点。

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

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

下一步

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