运行任务

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 子命令发生潜在冲突。

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

终端
pnpm 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 如何让你永不重复相同的工作。