Update Active Storage for ImageProcessing 2.0

rails/rails

Active StorageImageProcessing 2.0 に対応し、ruby-vipsmini_magick の明示的依存を追加しました。これにより、画像変換の安全性と依存関係の可視化が向上します。

背景

ImageProcessing 2.0 のリリースに伴い、画像処理ライブラリの依存が明示的に必要となり、既存の image_processing (~> 1.2) 記述では対応できなくなりました。さらに、libvips 8.13 以降では未検証フォーマット(BPM、PSD、ICO など)をデフォルトでブロックするようになり、Active Storage が受け入れていた "variable" コンテンツタイプとの齟齬が生じました。

この齟齬を解消しつつ、開発者が必要なライブラリを明示的に追加できるようにすることが、本PRの主目的です。

技術的な変更

GemfileGemfile.lock が更新され、image_processing のバージョン指定が ~> 2.0 に上げられ、ruby-vips (~> 2.3)mini_magick (~> 5.0) が新たに追加されました。Gemfile の差分は次のとおりです。

@@ -118,7 +118,9 @@ group :storage do
   gem "aws-sdk-s3", require: false
   gem "google-cloud-storage", "~> 1.11", require: false

-  gem "image_processing", "~> 1.2"
+  gem "image_processing", "~> 2.0"
+  gem "ruby-vips", "~> 2.3"
+  gem "mini_magick", "~> 5.0"
 end

Engine の警告ロジックが拡張され、image_processing が見つからないケースに加えて、ruby-vipsmini_magick が欠如している場合にも個別の警告が出力されます。これにより、開発者は不足している依存を即座に把握できます。

@@
-          when /image_processing/
-            ActiveStorage.logger.warn <<~WARNING.squish
-              Generating image variants require the image_processing gem.
-              Please add `gem "image_processing", "~> 1.2"` to your Gemfile
-              or set `config.active_storage.variant_processor = :disabled`.
-            WARNING
+          when /image_processing/
+            ActiveStorage.logger.warn <<~WARNING.squish
+              Generating image variants require the image_processing gem.
+              Please add `gem "image_processing", "~> 2.0"` to your Gemfile
+              or set `config.active_storage.variant_processor = :disabled`.
+            WARNING
+          when /ruby-vips/
+            ActiveStorage.logger.warn <<~WARNING.squish
+              Generating image variants with libvips requires the ruby-vips gem.
+              Please add `gem "ruby-vips", "~> 2.3"` to your Gemfile.
+            WARNING
+          when /mini_magick/
+            ActiveStorage.logger.warn <<~WARNING.squish
+              Generating image variants with ImageMagick requires the mini_magick gem.
+              Please add `gem "mini_magick", "~> 5.0"` to your Gemfile.
+            WARNING

エラーメッセージを投げる transformers のコードも同様にバージョン番号を更新し、image_processing が不足している場合の例外文言が新バージョンに合わせて変更されました。

@@
-    Please add `gem "image_processing", "~> 1.2"` to your Gemfile.
+    Please add `gem "image_processing", "~> 2.0"` to your Gemfile.

Vips transformer に Vips.block_untrusted(false) の呼び出しが追加され、環境変数 VIPS_BLOCK_UNTRUSTED が未設定の場合はデフォルトでブロック機能を無効化します。これにより、既存アプリが突如変換失敗するリスクを回避しつつ、必要に応じて安全側に切り替えられます。

@@
+Vips.block_untrusted(false) if Vips.respond_to?(:block_untrusted) && !ENV["VIPS_BLOCK_UNTRUSTED"]

ドキュメント (guides/source/active_storage_overview.md) も更新され、VIPS_BLOCK_UNTRUSTED 環境変数や Vips.block_untrusted(true) を使用したブロック設定の方法が記載されました。コメントの追記により、variant.rb でも gem の追加が必要である旨が明示されています。

設計判断

後方互換性 を最優先し、既存のデフォルトプロセッサ :vips はそのまま維持しつつ、依存が欠如した場合に警告を出すだけに留めました。コードパスの追加は最小限に抑えられ、従来のアプリは変更なしで動作します。

依存の明示化 を選択した理由は、Bundler が提供する依存管理の透明性を活かすためです。自動的にライブラリをロードする代わりに、Gemfile に明示的に記載させることで、バージョン衝突やプラットフォーム固有のビルド問題を事前に検知できます。

セキュリティ設定 に関しては、libvips の未検証フォーマットブロック機能をデフォルトで無効化し、環境変数や initializer で有効化できるようにした点が特徴です。これにより、既存アプリの互換性を損なわずに、必要な場合のみセキュリティを強化できる設計になっています。

まとめ

この PR は Active StorageImageProcessing 2.0 に合わせ、ruby-vipsmini_magick の明示的依存と安全なフォーマットブロック設定を導入した変更です。依存関係の可視化と警告メッセージの更新により、開発者は必要な gem を容易に把握でき、環境変数で libvips のセキュリティ挙動を柔軟に制御できます。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
317273e2

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文があり、背景・技術的変更・設計判断・まとめの各セクションが順序立てて配置されている。まとめは単なる繰り返しではなく、変更の意義を再提示している。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックのファイル名付きシンタックスハイライトは正しい形式。GitHubリンクは PR 番号がリンク化されているが、推奨形式は `[#57403](URL)` であるのに対し `[PR #57403](URL)` となっている。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

専門的な Rails 開発者向けの内容で、余計な基礎説明はなく適切なレベルで記述されている。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションは総論→各論→結論の流れで構成され、段落はトピックセンテンスで始まり 1 トピックに絞られ、長さも適切に分割されている。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事中のコードブロックは提供された Diff と完全に一致し、ファイル名・変更内容・追加行すべてが正確に反映されている。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

使用されている技術用語(image_processing、ruby-vips、mini_magick、variant_processor など)は PR と一致し、誤用はない。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

変更理由・影響・設計判断は PR の記述と合致し、技術的に正確な説明が行われている。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

全ての主張は PR のタイトル・説明・Diff に裏付けられ、根拠のない数値や外部知識の付加はない。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

バージョン番号やファイルパスなどの具体的数値は Diff と完全に一致している。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR のタイトルと完全に一致している。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

LTS、リリース日程、サポート状況など PR に記載されていない外部情報は一切含まれていない。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現の歪曲はなく、PR の記述と整合している。