仓库
文档
核心概念
过滤工作区

过滤工作区

一个单一仓库可以包含数百个或数千个工作区。默认情况下,从仓库根目录运行 turbo run test 将在所有可用工作区中执行 test 任务。

Without using a filter, test will be run across all packages

Turborepo 支持 --filter 标志,该标志允许你选择要在其中执行任务的工作区

With a filter on shared, only the shared package runs test

你可以使用它来

Turborepo 将针对每个匹配的工作区运行每个任务,确保根据 turbo.jsonpipeline 规范运行任何依赖于它的任务。

筛选语法

多个筛选器

你可以通过向命令传递多个 --filter 标志来指定多个筛选器

turbo build --filter=my-pkg --filter=my-app

按工作区名称筛选

当你只想在一个工作区中运行脚本时,可以使用一个筛选器:--filter=my-pkg

# Build 'my-pkg', letting `turbo` infer task dependencies
# from the pipeline defined in turbo.json
turbo run build --filter=my-pkg
 
# Build '@acme/bar', letting `turbo` infer task dependencies
# from the pipeline defined in turbo.json
turbo run build --filter=@acme/bar

如果你想在具有相似名称的多个工作区内运行任务,可以使用 glob 语法:--filter=*my-pkg*

# Build all workspaces that start with 'admin-', letting turbo infer task
# dependencies from the pipeline defined in turbo.json
turbo run build --filter=admin-*

范围

一些单一代码库在其工作区名称前添加范围,例如 @acme/ui@acme/app。只要范围 (@acme) 在整个代码库中是唯一的,你就可以从筛选器中省略它。

- turbo run build --filter=@acme/ui
+ turbo run build --filter=ui

包括匹配工作区的依赖项

有时,您需要确保共享包不会影响任何下游依赖项。为此,您可以使用 --filter=...my-lib

如果 my-app 依赖于 my-lib,则 ...my-lib 将选择 my-appmy-lib

包括 ^ (...^my-lib) 将选择 my-lib 的所有依赖项,但不包括 my-lib 本身。

# Test 'my-lib' and everything that depends on 'my-lib'
turbo run test --filter=...my-lib
 
# Test everything that depends on 'my-lib', but not 'my-lib' itself
turbo run test --filter=...^my-lib

包括匹配工作区的依赖项

有时,您需要确保 build 在您要定位的库的所有依赖项中运行。为此,您可以使用 --filter=my-app...

如果 my-app 依赖于 my-lib,则 my-app... 将选择 my-appmy-lib

包括 ^ (my-app^...) 将选择 my-app 的所有依赖项,但不包括 my-app 本身。

# Build 'my-app' and its dependencies
turbo run build --filter=my-app...
 
# Build 'my-app's dependencies, but not 'my-app' itself
turbo run build --filter=my-app^...

按目录筛选

当您想定位特定目录(而不是工作区名称)时很有用。它支持

  • 完全匹配:--filter=./apps/docs
  • Glob:--filter='./apps/*'
# Build all of the workspaces in the 'apps' directory
turbo run build --filter='./apps/*'

与其他语法结合

当将目录筛选器与其他语法结合时,用 {} 括起来。例如

# Build all of the workspaces in the 'libs' directory,
# and all the workspaces that depends on them
turbo run build --filter=...{./libs/*}

按更改的工作空间筛选

您可以在自某个提交以来发生更改的任何工作空间上运行任务。这些需要包装在 [] 中。

例如,--filter=[HEAD^1] 将选择在最近提交中发生更改的所有工作空间

# Test everything that changed in the last commit
turbo run test --filter=[HEAD^1]

检查一系列提交

如果您需要检查特定范围的提交,而不是与 HEAD 进行比较,您可以通过 [<from commit>...<to commit>] 设置比较的两个端点。

# Test each workspace that changed between 'main' and 'my-feature'
turbo run test --filter=[main...my-feature]

忽略更改的文件

您可以使用 --ignore 指定在计算哪些工作空间已更改时要忽略的更改的文件。

与其他语法结合

您还可以使用 ... 前缀提交引用,以针对已更改的工作空间匹配其他组件的依赖项。例如,如果 foo 的任何依赖项在上次提交中已更改,则可以选择 foo,您可以传递 --filter=foo...[HEAD^1]

# Build everything that depends on changes in branch 'my-feature'
turbo run build --filter=...[origin/my-feature]
 
# Build '@foo/bar' if it or any of its dependencies
# changed in the last commit
turbo run build --filter=@foo/bar...[HEAD^1]

您甚至可以将 []{} 语法结合在一起

# Test each workspace in the '@scope' scope that
# is in the 'packages' directory, if it has
# changed in the last commit
turbo run test --filter=@scope/*{./packages/*}[HEAD^1]

工作空间根目录

可以使用令牌 // 选择单体仓库的根目录。

# Run the format script from the root "package.json" file:
turbo run format --filter=//

排除工作空间

在筛选器前加上 !。整个筛选器中匹配的工作空间将从目标集中排除。例如,匹配除 @foo/bar 之外的所有内容:--filter=!@foo/bar。请注意,您可能需要根据您的 shell 适当转义 !(例如 \!)。

# Build everything except '@foo/bar'
turbo run build --filter=!@foo/bar
# Build all of the workspaces in the 'apps' directory, except the 'admin' workspace
turbo run build --filter=./apps/* --filter=!admin

通过全局 turbo

如果您使用的是 turbo 的全局安装版本,则从工作空间中运行会自动筛选到该工作空间的目录。这意味着从存储库根目录运行 turbo run test --filter={./packages/shared} 等同于运行 cd packages/shared && turbo run test

使用显式命名的工作空间运行将始终在存储库中的任何位置运行:turbo run test --filter=shared

Turborepo 的筛选器 API 设计和文档受到 pnpm(在新标签页中打开) 的启发