bunの新しいロックファイル形式に対応したパッケージマネージャー検出
Rails 8.1では、JavaScriptパッケージマネージャーの自動検出が改善され、bunの新しいテキストベースのロックファイル形式 bun.lock に対応しました。
背景
#56636でJavaScriptパッケージマネージャーの検出がロックファイルベースに統一されましたが、bunについては旧形式のバイナリロックファイル bun.lockb のみをチェックしていました。しかし、bunは現在デフォルトでテキストベースの bun.lock を使用するようになっており、新しいプロジェクトではこの形式が生成されます。その結果、新規プロジェクトでbunが正しく検出されない問題が発生していました。
技術的な変更
変更前:
def self.detect(root)
if root.join("bun.lockb").exist? || root.join("bun.config.js").exist?
:bun
elsif root.join("pnpm-lock.yaml").exist?
:pnpm
# ...
end
変更後:
def self.detect(root)
if root.join("bun.lock").exist? || root.join("bun.lockb").exist? || root.join("bun.config.js").exist?
:bun
elsif root.join("pnpm-lock.yaml").exist?
:pnpm
# ...
end
検出ロジックに bun.lock のチェックが追加され、新旧両方のロックファイル形式に対応するようになりました。これにより、Action Textなどのジェネレーターが依存パッケージをインストールする際に、正しいパッケージマネージャーが選択されます。
テストの追加
新しいロックファイル形式に対する検出が正しく動作することを確認するため、以下のテストケースが追加されています:
test "detects bun from bun.lock" do
FileUtils.touch(File.join(destination_root, "bun.lock"))
assert_equal :bun, Rails::Generators::JsPackageManager.detect(Pathname(destination_root))
end
また、Action Textインストールジェネレーターでも同様のテストが追加され、bun.lock が存在する場合に正しくbunコマンドが実行されることが検証されています。
設計判断
この変更では、旧形式の bun.lockb サポートを削除せず、新形式の bun.lock を追加する形で実装されています。これにより、古いプロジェクトとの互換性を維持しながら、新しいプロジェクトにも対応できるようになっています。bunのバージョンアップに伴う移行期間を考慮した実装といえます。