Skip to content

Bun は package.jsonworkspaces をサポートしています。ワークスペースを使用すると、いくつかの独立したパッケージで構成される モノレポ として複雑なソフトウェアを開発するのが簡単になります。

モノレポには次のような構造を持つことが一般的です。

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" キーを使用して、モノレポ内のパッケージ/ワークスペースとみなされるべきサブディレクトリを示します。すべてのワークスペースを packages というディレクトリに配置するのが一般的です。

json
{
  "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) を参照してください。
json
{
  "name": "my-project",
  "version": "1.0.0",
  "workspaces": ["packages/**", "!packages/**/test/**", "!packages/**/template/**"]
}

各ワークスペースには独自の package.json があります。モノレポ内の他のパッケージを参照するときは、package.json のバージョンフィールドとしてセマンティックバージョンまたはワークスペースプロトコル(例:workspace:*)を使用できます。

json
{
  "name": "pkg-a",
  "version": "1.0.0",
  "dependencies": {
    "pkg-b": "workspace:*"
  }
}

bun install は、可能な場合パッケージを重複排除して、モノレポ内のすべてのワークスペースの依存関係をインストールします。特定のワークスペースの依存関係のみをインストールしたい場合は、--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 でも

ワークスペースにはいくつかの主な利点があります。

  • コードを論理的部分に分割できます。 1 つのパッケージが別のパッケージに依存している場合、package.json で依存関係として追加するだけです。パッケージ ba に依存している場合、bun install は npm レジストリからダウンロードする代わりに、ローカルの packages/a ディレクトリを node_modules にインストールします。
  • 依存関係の重複を排除できます。 ab が共通の依存関係を共有している場合、それはルートの 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 倍高速

Bun by www.bunjs.com.cn 編集