使用 --filter
标志一次在多个包中执行生命周期脚本
bun --filter <pattern> <script>
假设你有一个包含两个包的单一仓库: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,显示它们各自的输出
匹配
--filter
接受一个模式来匹配特定包,按名称或路径。模式完全支持 glob 语法。
包名称 --filter <pattern>
名称模式根据 package.json
中指定的包名称选择包。例如,如果你有包 pkga
、pkgb
和 other
,你可以使用 *
匹配所有包,仅使用 pkg*
匹配 pkga
和 pkgb
,并通过提供包的完整名称来匹配特定包。
包路径 --filter ./<glob>
路径模式通过以 ./
开头来指定,并将选择与模式匹配的目录中的所有包。例如,要匹配 packages
的子目录中的所有包,可以使用 --filter './packages/**'
。要匹配位于 pkgs/foo
中的包,请使用 --filter ./pkgs/foo
。
工作区
过滤器尊重你的 工作区配置:如果你有一个指定哪些包是工作区一部分的 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 在运行脚本时将尊重包依赖顺序。假设你有一个依赖于工作区中另一个包 bar
的包 foo
,并且这两个包都有一个 build
脚本。当你运行 bun --filter '*' build
时,你会注意到 foo
只有在 bar
完成后才会开始运行。