--filter
(或 -F
) 标志用于在 monorepo 中按模式选择包。模式可以用于匹配包名称或包路径,并完全支持 glob 语法。
目前 --filter
受 bun install
和 bun outdated
支持,也可以用于一次运行多个包的脚本。
匹配
包名称 --filter <模式>
名称模式根据包名称(在 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
。
给定一个包含工作区 pkg-a
、pkg-b
和 pkg-c
(在 ./packages
下)的 monorepo
# 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.json
bun install --filter --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.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
# 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
完成后才开始运行。