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整理維護