レジストリからダウンロードされたすべてのパッケージは、~/.bun/install/cache または環境変数 BUN_INSTALL_CACHE_DIR で定義されたパスにあるグローバルキャッシュに保存されます。これらは ${name}@${version} のようなサブディレクトリに保存されるため、パッケージの複数のバージョンをキャッシュできます。
キャッシュの動作を設定する
[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 ドキュメント を参照してください。
bun install --backend symlink
node --preserve-symlinks ./foo.jsBun のランタイムは現在、--preserve-symlinks に相当するものを公開していません。