最小必須Rubyバージョンを3.3.0から3.3.1へ引き上げ
Rails全コンポーネントの required_ruby_version が >= 3.3.0 から >= 3.3.1 に変更されました。Ruby 3.3.0に存在するバグがRailsの一部を破壊するため、この引き上げが必要となりました。
背景
Ruby 3.3.0には、匿名rest引数(anonymous rest parameter)をブロック内でも使用した場合に SyntaxError が発生するバグが存在します。具体的には、ActionViewのコードがこのバグに抵触し、Ruby 3.3.0上でRailsを動作させると以下のエラーが発生します。
anonymous rest parameter is also used within block (SyntaxError)
この問題は #57026 で報告されており、ActionViewの該当箇所を匿名rest引数から明示的な引数に変更する修正も提案されています。しかし本PR(#57028)では、コードの修正ではなく 最小Rubyバージョンの引き上げ という対応が採られました。PRの説明によれば、Ruby 3.3.0を追加のテスト対象として維持するCI/CDリソースがないという事情も判断に影響しています。
技術的な変更
全gemspecの required_ruby_version が一斉に更新されました。変更対象は、Railsのすべてのコアコンポーネントおよびツール類です。
対象ファイルは以下の15ファイルです:
rails.gemspecactioncable/actioncable.gemspecactionmailbox/actionmailbox.gemspecactionmailer/actionmailer.gemspecactionpack/actionpack.gemspecactiontext/actiontext.gemspecactionview/actionview.gemspecactivejob/activejob.gemspecactivemodel/activemodel.gemspecactiverecord/activerecord.gemspecactivestorage/activestorage.gemspecactivesupport/activesupport.gemspecrailties/railties.gemspectools/rail_inspector/rail_inspector.gemspectools/releaser/releaser.gemspec
各ファイルの変更内容は同一で、以下のとおりです。
変更前:
s.required_ruby_version = ">= 3.3.0"
変更後:
s.required_ruby_version = ">= 3.3.1"
すべてのgemspecが一貫して同じバージョンを要求する構成は変わっておらず、バージョン番号のパッチレベルのみが変更されています。
設計判断
コードの修正ではなく最小バージョンの引き上げ という対応が選択されました。
参照先の #57026 ではActionViewの匿名rest引数を明示的な引数に変更する修正が提案されています。しかし本PRでは、その回避策を適用してRuby 3.3.0をサポートし続けるのではなく、バグを含むパッチバージョンを要件から除外する判断が下されています。PRの説明が示すように、CIでRuby 3.3.0を追加のテスト対象として維持するコストも考慮された判断です。
また、修正対象を rails.gemspec 単体ではなく全コンポーネントのgemspecに統一したことで、どのコンポーネントを個別にインストールした場合でも、Ruby 3.3.0との非互換が発生しないよう一貫性が保たれています。
まとめ
この変更は、Ruby 3.3.0のバグに起因するActionViewの破損を、コードの回避策ではなく最小バージョン要件の引き上げで解決したものです。Ruby 3.3.0を使用しているプロジェクトは3.3.1以上へのアップグレードが必要になりますが、これによりRuby側のバグに起因する予期しない挙動を回避できます。