Skip to content
On this page

过滤工作区

一个 monorepo 可以包含数百或数千个工作空间。默认情况下,从存储库的根运行 turbo run test 将在所有可用的工作区中执行 test 任务。

Turborepo 支持一个 --filter 标志,它允许您选择要在其中执行任务的工作空间。

你可以用它来:

  • 按工作区名称筛选
  • 按工作区目录进行筛选
  • 匹配工作区的 dependentsdependencies
  • 从工作区根目录执行任务
  • 根据 git 历史记录的变化进行筛选
  • 从选择中排除工作区

Turborepo 将根据 turbo.json 中的 pipeline,针对每个匹配的工作区运行每个任务,确保首先运行依赖于它的任何任务。

过滤器语法

多个过滤器

通过向命令传递多个 --filter 标志,可以指定多个过滤器:

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

根据工作区名称过滤

如果只想在一个工作区中运行脚本,可以使用一个过滤器: --filter=my-pkg

bash
# 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

如果希望在几个名称相似的工作区中运行任务,可以使用 globb 语法: --filter=*my-pkg*

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

Scopes

有些 monorepos 在他们的工作区名称前面加上一个作用域,比如 @acme/ui@acme/app。只要作用域(@acme)在整个代码库中是唯一的,就可以从过滤器中省略它。

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

包含匹配工作区的 dependents

有时,您需要确保您的共享包不会影响任何下游依赖项。

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

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

bash
# 测试 my-lib 以及所有依赖于 my-lib 的内容
turbo run test --filter=...my-lib

# 测试所有依赖于 my-lib 的内容,但不测试 my-lib 本身
turbo run test --filter=...^my-lib

包含匹配工作区的 dependencies

有时候,您需要确保在您所针对的库的所有依赖项中运行构建。为此,可以使用 --filter=my-app...

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

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

bash
# 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
  • Globs: --filter='./apps/*'
bash
# Build all of the workspaces in the 'apps' directory
turbo run build --filter='./apps/*'

与其他语法组合

将目录筛选器与其他语法组合时,请在{}中附上。例如:

bash
# 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] 将选择在最近的提交中更改的所有工作区:

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

检查提交范围

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

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

忽略已更改的文件

在计算哪些工作区发生了更改时,可以使用 --ignore 来指定要忽略的更改的文件

与其他语法组合

您还可以在提交引用前添加 ... 来匹配其他组件与更改后的工作区之间的依赖关系。例如,如果 foo 的任何依赖项在上次提交中发生了更改,可以传递 --filter=foo...[HEAD^1] 来选择 foo

bash
# 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]

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

bash
# 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]

工作区根

可以使用 // 选择 monorepo 的根。

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

不包括工作区

前置 ! 过滤器。整个过滤器中匹配的工作区将被排除在目标集之外。例如,除了 @foo/bar: --filter=!@foo/bar

bash
# 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