--filter(或 -F)标志用于在 monorepo 中按模式选择包。模式可用于匹配包名称或包路径,支持完整的 glob 语法。
目前 --filter 支持 bun install 和 bun outdated,也可用于一次性运行多个包的脚本。
匹配
包名称 --filter <pattern>
名称模式根据 package.json 中指定的包名称选择包。例如,如果你有包 pkg-a、pkg-b 和 other,你可以使用 * 匹配所有包,使用 pkg* 仅匹配 pkg-a 和 pkg-b,或者通过提供包的完整名称来匹配特定包。
包路径 --filter ./<glob>
路径模式通过以 ./ 开头指定,将选择所有匹配目录中的包。例如,要匹配 packages 子目录中的所有包,可以使用 --filter './packages/**'。要匹配位于 packages/foo 中的包,使用 --filter ./packages/foo。
bun install 和 bun outdated
bun install 和 bun outdated 都支持 --filter 标志。
bun install 默认会安装 monorepo 中所有包的依赖。要安装特定包的依赖,请使用 --filter。
给定一个 monorepo,在 ./packages 下有工作区 pkg-a、pkg-b 和 pkg-c:
# 为除 `pkg-c` 外的所有工作区安装依赖
bun install --filter '!pkg-c'
# 为 `./packages` 中的包安装依赖(`pkg-a`、`pkg-b`、`pkg-c`)
bun install --filter './packages/*'
# 与上面相同,但排除根 package.json
bun install --filter '!./' --filter './packages/*'同样,bun outdated 将显示 monorepo 中所有包的过时依赖,--filter 可用于将命令限制为包的子集:
# 显示以 `pkg-` 开头的工作区的过时依赖
bun outdated --filter 'pkg-*'
# 仅显示根 package.json 的过时依赖
bun outdated --filter './'有关这两个命令的更多信息,请参阅 bun install 和 bun outdated。
使用 --filter 运行脚本
使用 --filter 标志一次性在多个包中执行脚本:
bun --filter <pattern> <script>假设你有一个 monorepo,其中有两个包:packages/api 和 packages/frontend,它们都有一个 dev 脚本用于启动本地开发服务器。通常,你必须打开两个单独的终端标签页,cd 进入每个包目录,然后运行 bun dev:
cd packages/api
bun dev
# 在另一个终端中
cd packages/frontend
bun dev使用 --filter,你可以一次性在两个包中运行 dev 脚本:
bun --filter '*' dev两个命令将并行运行,你将看到一个漂亮的终端 UI 显示它们各自的输出:
在工作区中运行脚本
过滤器会遵循你的 工作区配置:如果你有一个 package.json 文件指定哪些包属于工作区,--filter 将仅限于这些包。此外,在工作区中,你可以使用 --filter 在工作区中任何位置的包中运行脚本:
# 包
# src/foo
# src/bar
# 在 src/bar 中:在 src/foo 中运行 myscript,无需 cd!
bun run --filter foo myscript依赖顺序
Bun 在运行脚本时会遵循依赖顺序。假设你在工作区中有一个包 foo 依赖于另一个包 bar,并且两个包都有一个 build 脚本。当你运行 bun --filter '*' build 时,你会注意到 foo 只会在 bar 完成后才开始运行。