--filter(或 -F)标志通过模式选择单体仓库中的包。模式匹配包名或包路径,支持完整的 glob 语法。
bun install 和 bun outdated 支持 --filter,你也可以使用它同时在多个包中运行脚本。
匹配
包名 --filter <pattern>
名称模式通过 package.json 中的 name 字段选择包。例如,如果你有包 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 为单体仓库中的每个包安装依赖。要为特定包安装依赖,请使用 --filter。
假设一个单体仓库在 ./packages 下有工作空间 pkg-a、pkg-b 和 pkg-c:
terminal
bun outdated 显示单体仓库中所有包的过期依赖,而 --filter 将命令限制为其中一部分:
terminal
bun install 和 bun outdated。
使用 --filter 运行脚本
使用 --filter 标志同时在多个包中执行脚本:
terminal
packages/api 和 packages/frontend,两者都有一个启动本地开发服务器的 dev 脚本。通常,你需要打开两个终端标签页,分别 cd 到每个包目录并运行 bun dev:
terminal
--filter,你可以同时在两个包中运行 dev 脚本:
terminal
在工作空间中运行脚本
过滤器尊重你的工作空间配置:如果你的package.json 指定了哪些包属于工作空间,--filter 仅匹配这些包。在工作空间中,--filter 还可以运行位于工作空间任何位置的包中的脚本:
terminal
并行和串行模式
将--filter 或 --workspaces 与 --parallel 或 --sequential 结合使用,可以在工作空间包中以 Foreman 风格的前缀输出运行脚本:
terminal
pkg-a:build | ...)。没有 --filter/--workspaces 时,前缀仅为脚本名(build | ...)。当包的 package.json 没有 name 字段时,Bun 使用相对于工作空间根的路径。
使用 --if-present 和 --workspaces 可以跳过没有请求脚本的包,而不是报错。
依赖顺序
Bun 在运行脚本时会考虑包的依赖顺序。假设你有一个包foo 依赖于工作空间中的另一个包 bar,两者都有 build 脚本。当你运行 bun --filter '*' build 时,foo 只在 bar 完成后才开始。