Skip to content

レジストリからダウンロードされたすべてのパッケージは、~/.bun/install/cache または環境変数 BUN_INSTALL_CACHE_DIR で定義されたパスにあるグローバルキャッシュに保存されます。これらは ${name}@${version} のようなサブディレクトリに保存されるため、パッケージの複数のバージョンをキャッシュできます。

キャッシュの動作を設定する

toml
[install.cache]
# キャッシュに使用するディレクトリ
dir = "~/.bun/install/cache"

# true の場合、グローバルキャッシュから読み込まない
# Bun は node_modules/.cache への書き込みを継続する可能性あり
disable = false

# true の場合、常にレジストリから最新のバージョンを解決する
disableManifest = false

再ダウンロードを最小限に抑える

Bun はパッケージの再ダウンロードを回避することに努めています。パッケージをインストールする際、キャッシュに package.json で指定された範囲内のバージョンが既に含まれている場合、Bun はそれを再ダウンロードする代わりにキャッシュされたパッケージを使用します。

インストールの詳細

セマンティックバージョンにプレリリースサフィックス(1.0.0-beta.0)またはビルドサフィックス(1.0.0+20220101)がある場合、長いファイルパスに関連するエラーの可能性を減らすために、その値のハッシュに置き換えられます。

node_modules フォルダが存在する場合、インストール前に Bun は node_modules に適切なバージョンのすべての期待されるパッケージが含まれていることを確認します。その場合、bun install は完了します。Bun は "name""version" を見つけ次第すぐに解析を停止するカスタム JSON パーサーを使用します。

パッケージが不足しているか、package.json と互換性のないバージョンを持っている場合、Bun はキャッシュ内で互換性のあるモジュールを確認します。見つかった場合、それは node_modules にインストールされます。それ以外の場合、パッケージはレジストリからダウンロードされ、その後インストールされます。


高速コピー

パッケージがキャッシュにダウンロードされると、Bun はそれらのファイルを node_modules にコピーする必要があります。Bun はこのタスクを実行するために利用可能な最速のシステムコールを使用します。Linux ではハードリンクを使用し、macOS では clonefile を使用します。


ディスク容量の節約

Bun は Linux と Windows でパッケージをプロジェクトの node_modules ディレクトリに「コピー」するためにハードリンクを使用するため、パッケージのコンテンツはディスク上の 1 か所のみに存在し、node_modules に専念するディスク容量を大幅に削減します。

この利点は macOS にも適用されますが、例外があります。macOS ではコピーオンライトである clonefile を使用します。つまり、ディスク容量を占有しませんが、ドライブの制限にカウントされます。この動作は、何かが node_modules/* をパッチしようとする場合に役立ち、他のインストールに影響を与えることは不可能になります。

インストール戦略

この動作は --backend フラグで設定可能で、Bun のすべてのパッケージ管理コマンドで尊重されます。

  • hardlink: Linux と Windows でのデフォルト。
  • clonefile: macOS でのデフォルト。
  • clonefile_each_dir: clonefile と似ていますが、ディレクトリごとに各ファイルを個別にクローンします。macOS でのみ利用可能で、clonefile よりもパフォーマンスが低下する傾向があります。
  • copyfile: 上記のいずれかが失敗した場合のフォールバック。最も遅いオプションです。macOS では fcopyfile() を使用し、Linux では copy_file_range() を使用します。
  • symlink: 現在、file:(および最終的には link:)依存関係でのみ使用されます。無限ループを防ぐために、node_modules フォルダのシンボリックリンクをスキップします。

--backend=symlink でインストールすると、各依存関係に独自の node_modules フォルダがない限り、または node--preserve-symlinks を渡さない限り、Node.js は依存関係の node_modules を解決しません。--preserve-symlinks に関する Node.js ドキュメント を参照してください。

bash
bun install --backend symlink
node --preserve-symlinks ./foo.js

Bun のランタイムは現在、--preserve-symlinks に相当するものを公開していません。

Bun by www.bunjs.com.cn 編集