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依赖于a,bun install会将本地的packages/a目录安装到node_modules中,而不是从 npm 注册表下载它。 - 依赖可以去重。 如果
a和b共享一个公共依赖,它将被_提升_到根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 倍