はじめに
2025年12月25日、Ruby言語の30周年を記念してRuby 4.0.0がリリースされました。本記事では、RailsプロジェクトでRuby 3.2から4.0へアップグレードした際の手順と注意点を解説します。
環境
- Ruby: 3.2.x → 4.0.0
- Rails: 8.0
- Bundler: 2.x → 4.x
Ruby 4.0の主な新機能
1. PRISM(新パーサー)
Ruby 4.0では新しいパーサー「PRISM」が標準搭載されています。
$ ruby --version
ruby 4.0.0 (2025-12-25 revision xxxxxxxx) +PRISM [arm64-darwin25]
+PRISMタグが表示され、新パーサーが有効になっていることがわかります。
2. ZJIT(次世代JITコンパイラ)
YJITの後継となる新しいJITコンパイラ「ZJIT」が導入されました。Rust 1.85.0以上でビルドすることで有効になります。
3. Ruby Box
モンキーパッチやグローバル変数の変更を他のBoxから分離できる新機能です。
主な破壊的変更
1. Frozen String Literals
Ruby 4.0では、# frozen_string_literal: trueマジックコメントがないファイルでも、文字列リテラルがfrozenになる可能性があります。
# エラーになる可能性のあるコード
str = "hello"
str << " world" # FrozenError!
str.gsub!(/a/, "b") # FrozenError!
# 安全なコード(mutable stringを明示的に作成)
str = +"hello" # +を付けるとmutableになる
str << " world" # OK
2. CGIライブラリの削除
CGIライブラリがデフォルトgemから削除されました。使用している場合はGemfileに追加が必要です。
# Gemfile
gem 'cgi'
3. その他の削除された機能
-
Process::Status#&とProcess::Status#>>(Ruby 3.3で非推奨) -
rb_path_check($SAFEパスチェック用、Ruby 2.7で削除) -
Binding#local_variablesで番号付きパラメータが含まれなくなった
アップグレード手順
1. Rubyのインストール
rbenvの場合
# ruby-buildを最新版に更新
brew upgrade ruby-build
# Ruby 4.0.0をインストール
rbenv install 4.0.0
# プロジェクトで使用するバージョンを設定
echo "4.0.0" > .ruby-version
rbenv rehash
asdfの場合
asdf plugin update ruby
asdf install ruby 4.0.0
asdf local ruby 4.0.0
2. Gemfileの更新
# Gemfile
ruby '4.0.0'
3. Bundlerの更新
Ruby 4.0にはBundler 4.xが同梱されています。
gem install bundler
bundle update --bundler
4. 依存関係のインストール
bundle install
mysql2 gemのビルドエラー対処
mysql2 gemでzstdライブラリが見つからないエラーが発生する場合:
# zstdをインストール
brew install zstd
# mysql2のビルド設定を追加
bundle config build.mysql2 --with-ldflags="-L/opt/homebrew/opt/zstd/lib"
# 再インストール
bundle install
5. Dockerfileの更新(Docker環境の場合)
# Before
FROM ruby:3.2-slim
# After
FROM ruby:4.0.0-slim
必要なパッケージの追加
Ruby 4.0ではネイティブ拡張のビルドに追加パッケージが必要な場合があります:
RUN apt-get update -qq && \
apt-get install -y \
build-essential \
libyaml-dev \ # psych gemに必要
# ... その他のパッケージ
互換性チェック
動作確認スクリプト
# Ruby 4.0互換性チェック
puts "=== Ruby 4.0.0 互換性チェック ==="
puts "1. 環境情報:"
puts " Ruby: #{RUBY_VERSION}"
puts " Rails: #{Rails.version}" if defined?(Rails)
puts "2. Frozen String Literalテスト:"
begin
mutable = +''
mutable << 'test'
puts " Mutable string: OK"
rescue => e
puts " エラー: #{e.message}"
end
puts "=== チェック完了 ==="
RuboCopの実行
bundle exec rubocop
よくある警告と対処法
tsort警告
tsort was loaded from the standard library, but will no longer be
part of the default gems starting from Ruby 4.1.0
対処法: Ruby 4.1への準備警告です。現時点では影響ありませんが、将来的にGemfileへの追加が必要になります。
# Gemfile(Ruby 4.1以降で必要)
gem 'tsort'
Platform警告
[DEPRECATED] Platform :mingw, :mswin, :x64_mingw will be removed in the future.
Please use platform :windows instead.
対処法: Gemfile.lockを再生成することで解消されます。
アップグレードチェックリスト
- ruby-build / asdfプラグインを最新版に更新
- Ruby 4.0.0をインストール
-
.ruby-versionを更新 -
Gemfileの
rubyバージョンを更新 -
bundle update --bundlerでBundlerを更新 -
bundle installで依存関係を再インストール - Dockerfile(使用している場合)のベースイメージを更新
-
Dockerfileに
libyaml-devを追加(psych gem用) -
# frozen_string_literal: trueが全ファイルにあることを確認 -
文字列ミューテーション(
<<,gsub!等)の使用箇所を確認 - CGIライブラリの使用有無を確認
- RuboCopを実行してオフェンスがないことを確認
- アプリケーションが起動することを確認
- 主要機能の動作確認
トラブルシューティング
エラー: FrozenError: can't modify frozen String
原因: 文字列リテラルを直接変更しようとしている
解決策:
# Before
str = "hello"
str << " world"
# After(方法1: mutable stringを使用)
str = +"hello"
str << " world"
# After(方法2: 新しい文字列を作成)
str = "hello"
str = str + " world"
エラー: uninitialized constant CGI
原因: CGIライブラリがデフォルトgemから削除された
解決策:
# Gemfile
gem 'cgi'
エラー: Your Ruby version is X.X.X, but your Gemfile specified 4.0.0
原因: 現在のRubyバージョンがGemfileの指定と異なる
解決策:
# rbenvの場合
rbenv local 4.0.0
rbenv rehash
# asdfの場合
asdf local ruby 4.0.0
エラー: psych gemのビルド失敗(Docker環境)
原因: libyamlの開発ライブラリが不足
解決策:
# Dockerfileに追加
RUN apt-get install -y libyaml-dev
まとめ
Ruby 4.0へのアップグレードは、事前に以下の点を確認しておくことでスムーズに進められます:
- Frozen String Literals対応: 全ファイルにマジックコメントを追加し、文字列ミューテーションを確認
- 削除されたライブラリの確認: CGI等を使用している場合はGemfileに追加
- Bundlerの更新: Ruby 4.0にはBundler 4.xが必要
- Docker環境: ベースイメージの更新と必要パッケージの追加
Ruby 4.0は30周年記念リリースとして、新しいパーサー(PRISM)やJITコンパイラ(ZJIT)など、パフォーマンスと開発体験を向上させる多くの改善が含まれています。