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

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

你可以使用它来
Turborepo 将针对每个匹配的工作区运行每个任务,确保根据 turbo.json 中 pipeline 规范运行任何依赖于它的任务。
筛选语法
多个筛选器
你可以通过向命令传递多个 --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-app 和 my-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-app 和 my-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(在新标签页中打开) 的启发