Bun

过滤器

--filter (或 -F) 标志用于在 monorepo 中按模式选择包。模式可以用于匹配包名称或包路径,并完全支持 glob 语法。

目前 --filterbun installbun outdated 支持,也可以用于一次运行多个包的脚本。

匹配

包名称 --filter <模式>

名称模式根据包名称(在 package.json 中指定)选择包。例如,如果您有包 pkg-apkg-bother,您可以使用 * 匹配所有包,使用 pkg* 匹配仅 pkg-apkg-b,并通过提供包的完整名称来匹配特定包。

包路径 --filter ./<glob>

路径模式通过以 ./ 开头模式来指定,并将选择与模式匹配的目录中的所有包。例如,要匹配 packages 子目录中的所有包,您可以使用 --filter './packages/**'。要匹配位于 packages/foo 中的包,请使用 --filter ./packages/foo

bun installbun outdated

bun installbun outdated 都支持 --filter 标志。

默认情况下,bun install 将为 monorepo 中的所有包安装依赖项。要为特定包安装依赖项,请使用 --filter

给定一个包含工作区 pkg-apkg-bpkg-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 installbun outdated

使用 --filter 运行脚本

使用 --filter 标志一次执行多个包中的脚本

bun --filter <pattern> <script>

假设您有一个包含两个包的 monorepo:packages/apipackages/frontend,两者都有一个 dev 脚本,用于启动本地开发服务器。通常,您需要打开两个单独的终端选项卡,cd 进入每个包目录,然后运行 bun dev

cd packages/api
bun dev

# in another terminal
cd packages/frontend
bun dev

使用 --filter,您可以一次在两个包中运行 dev 脚本

bun --filter '*' dev

这两个命令将并行运行,您将看到一个漂亮的终端 UI 显示它们各自的输出

Terminal Output

在工作区中运行脚本

过滤器尊重您的 工作区配置:如果您有一个 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 完成后才开始运行。