--filter(或 -F)标志用于在 monorepo 中按模式选择包。模式可以用于匹配包名或包路径,支持完整的全局匹配语法。
目前 --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:
terminal
bun outdated 会显示 monorepo 中所有包的过期依赖,--filter 可以限制命令只作用于部分包:
terminal
bun install 和 bun outdated。
使用 --filter 运行脚本
使用 --filter 标志可以一次在多个包中执行脚本:
terminal
packages/api 和 packages/frontend,它们都带有一个会启动本地开发服务器的 dev 脚本。通常你需要打开两个终端标签页,进入每个包目录分别运行 bun dev:
terminal
--filter,你可以同时在这两个包中运行 dev 脚本:
terminal
在工作区中运行脚本
过滤器会遵循你的工作区配置:如果你的package.json 指定了哪些包属于工作区,则 --filter 只会限制在这些包内。另外,在工作区中你可以使用 --filter 来运行位于任何地方的包中的脚本:
terminal
依赖顺序
Bun 在运行脚本时会尊重包的依赖顺序。假设你的工作区中包foo 依赖包 bar,两者都带有 build 脚本。当你运行 bun --filter '*' build,你会发现 foo 只有在 bar 完成后才开始运行。