Turborepo

运行任务

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 时,您可以使用以下工作流程更快地运行:

  • 最常用命令的变体:当 build 脚本是 turbo build 时,它在 package.json 中最有实用性 - 但您可能目前只对特定包感兴趣。您可以使用 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 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 如何使您永远不必重复做相同的工作。

小时

节省的总计算量
开始使用
远程缓存 →

本页内容