Bun unterstützt workspaces in package.json. Workspaces erleichtern die Entwicklung komplexer Software als Monorepo, das aus mehreren unabhängigen Paketen besteht.
Es ist üblich, dass ein Monorepo die folgende Struktur hat:
<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.jsonIn der root package.json wird der "workspaces"-Schlüssel verwendet, um anzugeben, welche Unterverzeichnisse als Pakete/Workspaces im Monorepo betrachtet werden sollen. Es ist üblich, alle Workspaces in einem Verzeichnis namens packages zu platzieren.
{
"name": "my-project",
"version": "1.0.0",
"workspaces": ["packages/*"],
"devDependencies": {
"example-package-in-monorepo": "workspace:*"
}
}NOTE
**Glob-Unterstützung** — Bun unterstützt die vollständige Glob-Syntax in `"workspaces"`, einschließlich negativer Muster (z.B. `!**/excluded/**`). Siehe [hier](/de/runtime/glob#supported-glob-patterns) für eine umfassende Liste der unterstützten Syntax.{
"name": "my-project",
"version": "1.0.0",
"workspaces": ["packages/**", "!packages/**/test/**", "!packages/**/template/**"]
}Jeder Workspace hat seine eigene package.json. Beim Verweisen auf andere Pakete im Monorepo können Semver- oder Workspace-Protokolle (z.B. workspace:*) als Versionsfeld in Ihrer package.json verwendet werden.
{
"name": "pkg-a",
"version": "1.0.0",
"dependencies": {
"pkg-b": "workspace:*"
}
}bun install installiert Abhängigkeiten für alle Workspaces im Monorepo und dedupliziert Pakete, wenn möglich. Wenn Sie nur Abhängigkeiten für bestimmte Workspaces installieren möchten, können Sie das --filter-Flag verwenden.
# Installiert Abhängigkeiten für alle Workspaces, die mit `pkg-` beginnen, außer `pkg-c`
bun install --filter "pkg-*" --filter "!pkg-c"
# Pfade können ebenfalls verwendet werden. Dies entspricht dem obigen Befehl.
bun install --filter "./packages/pkg-*" --filter "!pkg-c" # oder --filter "!./packages/pkg-c"Beim Veröffentlichen werden workspace:-Versionen durch die package.json-Version des Pakets ersetzt:
"workspace:*" -> "1.0.1"
"workspace:^" -> "^1.0.1"
"workspace:~" -> "~1.0.1"Das Festlegen einer bestimmten Version hat Vorrang vor der package.json-Version des Pakets:
"workspace:1.0.2" -> "1.0.2" // Auch wenn die aktuelle Version 1.0.1 istWorkspaces haben einige Hauptvorteile:
- Code kann in logische Teile aufgeteilt werden. Wenn ein Paket von einem anderen abhängt, können Sie es einfach als Abhängigkeit in
package.jsonhinzufügen. Wenn Paketbvonaabhängt, installiertbun installIhr lokalespackages/a-Verzeichnis innode_modules, anstatt es von der npm-Registry herunterzuladen. - Abhängigkeiten können dedupliziert werden. Wenn
aundbeine gemeinsame Abhängigkeit teilen, wird sie in das rootnode_modules-Verzeichnis gehoisst. Dies reduziert redundante Festplattennutzung und minimiert "Dependency Hell"-Probleme, die mit der gleichzeitigen Installation mehrerer Versionen eines Pakets verbunden sind. - Skripte in mehreren Paketen ausführen. Sie können das
--filter-Flag verwenden, umpackage.json-Skripte in mehreren Paketen in Ihrem Workspace einfach auszuführen, oder--workspaces, um Skripte über alle Workspaces hinweg auszuführen.
Versionen mit Katalogen teilen
Wenn viele Pakete dieselben Abhängigkeitsversionen benötigen, können Sie diese Versionen einmal in der root package.json definieren und von Ihren Workspaces aus mit dem catalog:-Protokoll darauf verweisen. Die Aktualisierung des Katalogs aktualisiert automatisch jedes Paket, das darauf verweist. Siehe Kataloge für Details.
NOTE
⚡️ **Geschwindigkeit** — Installationen sind schnell, selbst für große Monorepos. Bun installiert das [Remix](https://github.com/remix-run/remix) Monorepo in etwa `500ms` unter Linux.- 28x schneller als
npm install - 12x schneller als
yarn install(v1) - 8x schneller als
pnpm install