Bun 支援 workspaces
在 package.json
中。 工作區讓開發複雜的軟體作為由幾個獨立套件組成的monorepo變得容易。
monorepo 通常具有以下結構
tree
<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
的目錄中。
{
"name": "my-project",
"version": "1.0.0",
"workspaces": ["packages/*"],
"devDependencies": {
"example-package-in-monorepo": "workspace:*"
}
}
Glob 支援 — Bun 在 "workspaces"
中支援完整的 glob 語法(請參閱此處以獲取支援語法的完整列表),除了排除項(例如 !**/excluded/**
),這些尚未實作。
每個工作區都有自己的 package.json
。 當引用 monorepo 中的其他套件時,可以使用 semver 或工作區協定(例如 workspace:*
)作為 package.json
中的版本欄位。
{
"name": "pkg-a",
"version": "1.0.0",
"dependencies": {
"pkg-b": "workspace:*"
}
}
bun install
將安裝 monorepo 中所有工作區的依賴項,如果可能,將套件去重複。 如果您只想為特定的工作區安裝依賴項,則可以使用 --filter
標誌。
# Install dependencies for all workspaces starting with `pkg-` except for `pkg-c`
bun install --filter "pkg-*" --filter "!pkg-c"
# Paths can also be used. This is equivalent to the command above.
bun install --filter "./packages/pkg-*" --filter "!pkg-c" # or --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" // Even if current version is 1.0.1
工作區有幾個主要優點。
- 程式碼可以拆分為邏輯部分。 如果一個套件依賴於另一個套件,您可以簡單地將其作為依賴項添加到
package.json
中。 如果套件b
依賴於a
,則bun install
將把您的本地packages/a
目錄安裝到node_modules
中,而不是從 npm 註冊表下載它。 - 依賴項可以去重複。 如果
a
和b
共用一個通用依賴項,它將被提升到根node_modules
目錄。 這減少了冗餘的磁碟使用量,並最大限度地減少了與同時安裝多個套件版本相關的「依賴地獄」問題。 - 在多個套件中執行腳本。 您可以使用
--filter
標記,輕鬆地在工作區中的多個套件中執行package.json
腳本。
⚡️ 速度 — 安裝速度很快,即使是大型的 monorepo 也是如此。在 Linux 上,Bun 安裝 Remix monorepo 大約只需 500ms
。
- 比
npm install
快 28 倍 - 比
yarn install
(v1) 快 12 倍 - 比
pnpm install
快 8 倍
