--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。
# Install dependencies for all workspaces except `pkg-c`bun install --filter '!pkg-c'
# Install dependencies for packages in `./packages` (`pkg-a`, `pkg-b`, `pkg-c`)bun install --filter './packages/*'
# Save as above, but exclude the root package.jsonbun install --filter '!./' --filter './packages/*'类似地,bun outdated 将显示 monorepo 中所有包的过时依赖项,而 --filter 可用于将命令限制为包的子集。
# Display outdated dependencies for workspaces starting with `pkg-`bun outdated --filter 'pkg-*'
# Display outdated dependencies for only the root package.jsonbun outdated --filter './'有关这两个命令的更多信息,请参阅 bun install 和 bun outdated。
使用 --filter 运行脚本
使用 --filter 标志一次性执行多个包中的脚本。
bun --filter <pattern> <script>
假设您有一个 monorepo,包含两个包:packages/api 和 packages/frontend,它们都有一个用于启动本地开发服务器的 dev 脚本。通常,您需要打开两个单独的终端标签页,进入每个包目录,然后运行 bun dev。
cd packages/api
bun dev
# in another terminal
cd packages/frontend
bun dev
使用 --filter,您可以同时在两个包中运行 dev 脚本。
bun --filter '*' dev
这两个命令将并行运行,您将看到一个漂亮的终端 UI 显示它们各自的输出。
在工作区中运行脚本
过滤器会尊重您的 工作区配置:如果您有一个 package.json 文件指定了哪些包属于工作区, --filter 将仅限于这些包。此外,在工作区中,您可以使用 --filter 在工作区中任何位置的包中运行脚本。
# Packages
# src/foo
# src/bar
# in src/bar: runs myscript in src/foo, no need to cd!
bun run --filter foo myscript
依赖顺序
Bun 在运行脚本时将尊重包的依赖顺序。假设您有一个包 foo,它依赖于您工作区中的另一个包 bar,并且这两个包都有一个 build 脚本。当您运行 bun --filter '*' build 时,您会注意到 foo 要在 bar 完成后才会开始运行。