Bun は package.json の workspaces をサポートしています。ワークスペースを使用すると、いくつかの独立したパッケージで構成される モノレポ として複雑なソフトウェアを開発するのが簡単になります。
モノレポには次のような構造を持つことが一般的です。
<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" キーを使用して、モノレポ内のパッケージ/ワークスペースとみなされるべきサブディレクトリを示します。すべてのワークスペースを packages というディレクトリに配置するのが一般的です。
{
"name": "my-project",
"version": "1.0.0",
"workspaces": ["packages/*"],
"devDependencies": {
"example-package-in-monorepo": "workspace:*"
}
}NOTE
**glob サポート** — Bun は `"workspaces"` で完全な glob 構文をサポートしており、負のパターン(例: `!**/excluded/**`)も含まれます。サポートされている構文の包括的なリストは[こちら](/ja/runtime/glob#supported-glob-patterns) を参照してください。{
"name": "my-project",
"version": "1.0.0",
"workspaces": ["packages/**", "!packages/**/test/**", "!packages/**/template/**"]
}各ワークスペースには独自の package.json があります。モノレポ内の他のパッケージを参照するときは、package.json のバージョンフィールドとしてセマンティックバージョンまたはワークスペースプロトコル(例:workspace:*)を使用できます。
{
"name": "pkg-a",
"version": "1.0.0",
"dependencies": {
"pkg-b": "workspace:*"
}
}bun install は、可能な場合パッケージを重複排除して、モノレポ内のすべてのワークスペースの依存関係をインストールします。特定のワークスペースの依存関係のみをインストールしたい場合は、--filter フラグを使用できます。
# `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 でもワークスペースにはいくつかの主な利点があります。
- コードを論理的部分に分割できます。 1 つのパッケージが別のパッケージに依存している場合、
package.jsonで依存関係として追加するだけです。パッケージbがaに依存している場合、bun installは npm レジストリからダウンロードする代わりに、ローカルのpackages/aディレクトリをnode_modulesにインストールします。 - 依存関係の重複を排除できます。
aとbが共通の依存関係を共有している場合、それはルートのnode_modulesディレクトリに 巻き上げられます。これにより、冗長なディスク使用量が削減され、パッケージの複数のバージョンを同時にインストールすることに関連する「依存関係地獄」の問題が最小限に抑えられます。 - 複数のパッケージでスクリプトを実行できます。
--filterフラグ を使用して、ワークスペース内の複数のパッケージでpackage.jsonスクリプトを簡単に実行できます。または、すべてのワークスペースでスクリプトを実行するには--workspacesを使用できます。
カタログでバージョンを共有する
多くのパッケージで同じ依存関係バージョンが必要な場合、カタログを使用すると、 それらのバージョンをルートの package.json で一度定義し、 ワークスペースから catalog: プロトコルを使用して参照できます。カタログを更新すると、 それを参照するすべてのパッケージが自動的に更新されます。詳細は カタログ を参照してください。
NOTE
⚡️ **速度** — 大きなモノレポでもインストールは高速です。Bun は Linux で [Remix](https://github.com/remix-run/remix) モノレポを約 `500ms` でインストールします。npm installより 28 倍高速yarn install(v1)より 12 倍高速pnpm installより 8 倍高速