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 倍