Skip to content

Bun 支持 package.json 中的 workspaces。工作区使得将复杂软件开发为由几个独立包组成的 monorepo 变得容易。

monorepo 通常具有以下结构:

txt
<root>
├── README.md
├── bun.lock
├── package.json
├── tsconfig.json
└── packages
    ├── pkg-a
    │   ├── index.ts
    │   ├── package.json
    │   └── tsconfig.json
    ├── pkg-b
    │   ├── index.ts
    │   ├── package.json
    │   └── tsconfig.json
    └── pkg-c
        ├── index.ts
        ├── package.json
        └── tsconfig.json

在根 package.json 中,"workspaces" 键用于指示哪些子目录应被视为 monorepo 中的包/工作区。通常将所有工作区放在名为 packages 的目录中。

json
{
  "name": "my-project",
  "version": "1.0.0",
  "workspaces": ["packages/*"],
  "devDependencies": {
    "example-package-in-monorepo": "workspace:*"
  }
}

NOTE

**Glob 支持** — Bun 在 `"workspaces"` 中支持完整的 glob 语法,包括否定模式(例如 `!**/excluded/**`)。请参阅 [此处](/zh-cn/runtime/glob#supported-glob-patterns) 获取支持语法的完整列表。
json
{
  "name": "my-project",
  "version": "1.0.0",
  "workspaces": ["packages/**", "!packages/**/test/**", "!packages/**/template/**"]
}

每个工作区都有自己的 package.json。当引用 monorepo 中的其他包时,semver 或工作区协议(例如 workspace:*)可用作 package.json 中的版本字段。

json
{
  "name": "pkg-a",
  "version": "1.0.0",
  "dependencies": {
    "pkg-b": "workspace:*"
  }
}

bun install 将为 monorepo 中的所有工作区安装依赖,尽可能去重包。如果你只想为特定工作区安装依赖,可以使用 --filter 标志。

bash
# 为所有以 `pkg-` 开头的工作区安装依赖,除了 `pkg-c`
bun install --filter "pkg-*" --filter "!pkg-c"

# 也可以使用路径。这等同于上面的命令。
bun install --filter "./packages/pkg-*" --filter "!pkg-c" # 或 --filter "!./packages/pkg-c"

发布时,workspace: 版本会被包的 package.json 版本替换,

"workspace:*" -> "1.0.1"
"workspace:^" -> "^1.0.1"
"workspace:~" -> "~1.0.1"

设置特定版本优先于包的 package.json 版本,

"workspace:1.0.2" -> "1.0.2" // 即使当前版本是 1.0.1

工作区有几个主要优势。

  • 代码可以分割为逻辑部分。 如果一个包依赖于另一个包,你可以简单地在 package.json 中将其添加为依赖。如果包 b 依赖于 abun install 会将本地的 packages/a 目录安装到 node_modules 中,而不是从 npm 注册表下载它。
  • 依赖可以去重。 如果 ab 共享一个公共依赖,它将被_提升_到根 node_modules 目录。这减少了冗余的磁盘使用,并最大限度地减少与同时安装多个版本的包相关的"依赖地狱"问题。
  • 在多个包中运行脚本。 你可以使用 --filter 标志 轻松运行工作区中多个包的 package.json 脚本,或使用 --workspaces 在所有工作区中运行脚本。

使用目录共享版本

当许多包需要相同的依赖版本时,目录让你可以在根 package.json 中一次性定义 这些版本,并使用 catalog: 协议从工作区引用它们。更新目录会自动 更新每个引用它的包。有关详细信息,请参阅 目录

NOTE

⚡️ **速度** — 安装速度很快,即使是大型 monorepo。Bun 在 Linux 上大约 `500ms` 内安装 [Remix](https://github.com/remix-run/remix) monorepo。
  • npm install 快 28 倍
  • yarn install(v1)快 12 倍
  • pnpm install 快 8 倍

Bun学习网由www.bunjs.com.cn整理维护