Devise 5 サポートを Rails バージョン別に段階的に導入
ActiveAdmin が Devise 5 との互換性を確立しつつ、Ruby バージョン制約を持つ旧 Rails 系列では Devise 4.x を維持するという段階的なアップグレード戦略を採用しました。
背景
この変更は、#8936 で実施された Devise 5 および Formtastic 6 サポート追加のバックポートです。Devise 5 への対応は長らく保留されていました。その原因は Formtastic 側の制約にあり、各 Gemfile に残されていた # TODO: relax this dependency when formtastic/formtastic#1401 will be fixed というコメントがその経緯を示しています。
Formtastic の該当 Issue が解消され Formtastic 6 がリリースされたことで、Devise 5 対応の障壁が取り除かれました。ただし、Formtastic 6 は Ruby 3.2 以上を要求するため、Ruby 3.1 でテストされる旧 Rails 系列(6.1・7.0・7.1・7.2)では Devise 5 への移行が今回のスコープ外となっています。
技術的な変更
変更の核心は、Rails バージョンに応じた依存バージョンの二分化です。メインの Gemfile と Rails 8.0・8.1 向けの Gemfile では Devise 5 および Formtastic 6 を採用し、Rails 6.1〜7.2 向けの Gemfile では Devise 4.9 を維持します。
Rails 8.x 系(Gemfile および gemfiles/rails_80/Gemfile)の変更:
- gem "devise", "~> 4.9" # TODO: relax this dependency when formtastic/formtastic#1401 will be fixed
+ gem "devise", "~> 5.0"
- gem "formtastic", ">= 5.0.0"
+ gem "formtastic", ">= 6.0.0"
Rails 6.1〜7.2 系(gemfiles/rails_61/Gemfile 等)の変更:
- gem "devise", "~> 4.9" # TODO: relax this dependency when formtastic/formtastic#1401 will be fixed
+
+ # Devise 5 requires Formtastic 6, which requires Ruby 3.2. This Rails version
+ # is tested against Ruby 3.1, so this dependency cannot be relaxed
+ gem "devise", "~> 4.9"
コメントの内容も # TODO: から制約の理由を明示する説明コメントへと書き換えられており、「解決待ち」から「意図的な制約」への状態変化が記録されています。
ランタイムの互換性チェックを担う lib/active_admin/dependency.rb も更新され、Devise の受け入れ範囲が拡張されています。
- DEVISE = ">= 4.0", "< 5"
+ DEVISE = ">= 4.0", "< 6"
この変更により、ActiveAdmin が起動時に依存バージョンを検証する際、Devise 5.x がエラーなく受け入れられるようになります。なお、Devise 5.0.2 では railties の最低要件が >= 4.1.0 から >= 7.0 へ引き上げられており、この依存制約の変化が旧 Rails 系列で Devise 5 を採用できない直接的な理由の一つでもあります。
設計判断
#8936 の説明によると、Devise の最低要件はあえて変更しない という方針が採られています。Devise 4 は引き続きサポートされるため、最低バージョンを 5 に引き上げるとダウンストリームのアプリケーションに不要な強制アップグレードを課すことになります。
一方、Formtastic については最低要件を >= 6.0.0 へ引き上げています。Formtastic 6 は ActiveAdmin の Ruby 最低要件に一致しており、Devise 4 と Devise 5 の両方に対応しているため、この引き上げは破壊的変更とならないと判断されています。
Rails バージョン別の Gemfile を持つ構成が、この段階的な戦略の実現を支えています。Ruby 3.2 を要求する新しい依存チェーン(Devise 5 → Formtastic 6 → Ruby 3.2)は、それを満たせる Rails 8.x の CI 環境にのみ適用され、旧 Rails 系列では制約の理由をコメントで明示したうえで Devise 4.x を固定する設計です。
まとめ
本 PR は、Ruby バージョン制約という現実的な制限を受け入れながら、破壊的変更を最小化しつつ Devise 5 との互換性を確立した変更です。dependency.rb の上限バージョン変更(< 5 → < 6)という一行の修正と、Rails バージョン別 Gemfile の段階的な設定が組み合わさることで、ダウンストリームアプリケーションへの影響を抑えながら最新の依存ライブラリへの対応が実現されています。