> ## Documentation Index
> Fetch the complete documentation index at: https://bun.ll1025.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# bun --filter

> 使用 --filter 标志按模式选择单体仓库中的包

`--filter`（或 `-F`）标志通过模式选择单体仓库中的包。模式匹配包名或包路径，支持完整的 glob 语法。

`bun install` 和 `bun outdated` 支持 `--filter`，你也可以使用它同时在多个包中运行脚本。

***

## 匹配

### 包名 `--filter <pattern>`

名称模式通过 `package.json` 中的 `name` 字段选择包。例如，如果你有包 `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` 为单体仓库中的每个包安装依赖。要为特定包安装依赖，请使用 `--filter`。

假设一个单体仓库在 `./packages` 下有工作空间 `pkg-a`、`pkg-b` 和 `pkg-c`：

```bash terminal icon="terminal" theme={null}
# 为除 `pkg-c` 之外的所有工作空间安装依赖
bun install --filter '!pkg-c'

# 为 `./packages` 下的包安装依赖（pkg-a、pkg-b、pkg-c）
bun install --filter './packages/*'

# 同上，但排除根 package.json
bun install --filter '!./' --filter './packages/*'
```

类似地，`bun outdated` 显示单体仓库中所有包的过期依赖，而 `--filter` 将命令限制为其中一部分：

```bash terminal icon="terminal" theme={null}
# 显示以 `pkg-` 开头的工作空间的过期依赖
bun outdated --filter 'pkg-*'

# 仅显示根 package.json 的过期依赖
bun outdated --filter './'
```

请参阅 [`bun install`](/pm/cli/install) 和 [`bun outdated`](/pm/cli/outdated)。

***

## 使用 `--filter` 运行脚本

使用 `--filter` 标志同时在多个包中执行脚本：

```bash terminal icon="terminal" theme={null}
bun --filter <pattern> <script>
```

假设你有一个包含两个包的单体仓库：`packages/api` 和 `packages/frontend`，两者都有一个启动本地开发服务器的 `dev` 脚本。通常，你需要打开两个终端标签页，分别 `cd` 到每个包目录并运行 `bun dev`：

```bash terminal icon="terminal" theme={null}
cd packages/api
bun dev

# 在另一个终端中
cd packages/frontend
bun dev
```

使用 `--filter`，你可以同时在两个包中运行 `dev` 脚本：

```bash terminal icon="terminal" theme={null}
bun --filter '*' dev
```

两个脚本并行运行，终端 UI 显示各自的输出：

<Frame>![终端输出](https://github.com/oven-sh/bun/assets/48869301/2a103e42-9921-4c33-948f-a1ad6e6bac71)</Frame>

### 在工作空间中运行脚本

过滤器尊重你的[工作空间配置](/pm/workspaces)：如果你的 `package.json` 指定了哪些包属于工作空间，`--filter` 仅匹配这些包。在工作空间中，`--filter` 还可以运行位于工作空间任何位置的包中的脚本：

```bash terminal icon="terminal" theme={null}
# 包
# src/foo
# src/bar

# 在 src/bar 中：在 src/foo 中运行 myscript，无需 cd！
bun run --filter foo myscript
```

### 并行和串行模式

将 `--filter` 或 `--workspaces` 与 `--parallel` 或 `--sequential` 结合使用，可以在工作空间包中以 Foreman 风格的前缀输出运行脚本：

```bash terminal icon="terminal" theme={null}
# 在所有匹配的包中并发运行 "build"
bun run --parallel --filter '*' build

# 在所有工作空间包中依次运行 "build"
bun run --sequential --workspaces build

# 在所有包中运行 glob 匹配的脚本
bun run --parallel --filter '*' "build:*"

# 即使某个包的脚本失败也继续运行
bun run --parallel --no-exit-on-error --filter '*' test

# 在所有包中运行多个脚本
bun run --parallel --filter '*' build lint
```

每行输出都带有包名和脚本名前缀（`pkg-a:build | ...`）。没有 `--filter`/`--workspaces` 时，前缀仅为脚本名（`build | ...`）。当包的 `package.json` 没有 `name` 字段时，Bun 使用相对于工作空间根的路径。

使用 `--if-present` 和 `--workspaces` 可以跳过没有请求脚本的包，而不是报错。

### 依赖顺序

Bun 在运行脚本时会考虑包的依赖顺序。假设你有一个包 `foo` 依赖于工作空间中的另一个包 `bar`，两者都有 `build` 脚本。当你运行 `bun --filter '*' build` 时，`foo` 只在 `bar` 完成后才开始。
