rails new が vips 未インストール環境でも動作するように Gemfile の require オプションを追加
rails new が vips が無い環境で失敗する回帰バグを解消し、Active Storage が実際に利用する際だけ ruby-vips をロードするように変更しました。この修正により、開発者は vips を必須とせずにアプリケーション雛形を生成でき、不要なブートエラーを回避できます。
背景
rails new はテンプレート生成時に Gemfile.tt に記載された gem を即座に require しようとしますが、ruby-vips がインストールされていない環境では Bundler::GemRequireError が発生し、プロジェクト作成が中断されました(#57612)。この挙動は vips を必須としない開発フローに合致せず、回帰として認識されました。したがって、vips が不要なケースでも rails new が成功することが求められました。
技術的な変更
Gemfile.tt の ruby-vips 行に require: false オプションを付与し、テンプレート生成時の自動ロードを抑制しました。変更前後は次のとおりです。
@@ -38,7 +38,7 @@ gem "thruster", require: false
# Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images]
gem "image_processing", "~> 2.0"
-gem "ruby-vips", "~> 2.3"
+gem "ruby-vips", "~> 2.3", require: false
さらに、app_generator_test.rb にテストを追加し、生成される Gemfile に require: false が含まれること、Active Storage を除外した場合に ruby-vips が出力されないことを検証しました。これにより、変更が期待通りに機能することが CI で保証されます。
設計判断
require: false を選択した理由は、既存の設定キーを変更せずに動作を遅延させ、後方互換性を保つためです。Active Storage が実行時に gem をロードしようとした際に初めてエラーが発生するので、vips が不要なアプリでは問題が表面化しません。このアプローチは追加の設定項目や条件分岐を最小限に抑え、コードベースへの侵入度を低く保ちます。
まとめ
本 PR は rails new が vips 未インストール環境でも失敗しないよう、ruby-vips の自動 require を無効化し、必要時にのみエラーが顕在化する設計へと転換しました。変更はテンプレートとテストの2点に留まり、既存アプリへの影響はありません。