1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ruby 4.0にアップグレードした話

Posted at

はじめに

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へのアップグレードは、事前に以下の点を確認しておくことでスムーズに進められます:

  1. Frozen String Literals対応: 全ファイルにマジックコメントを追加し、文字列ミューテーションを確認
  2. 削除されたライブラリの確認: CGI等を使用している場合はGemfileに追加
  3. Bundlerの更新: Ruby 4.0にはBundler 4.xが必要
  4. Docker環境: ベースイメージの更新と必要パッケージの追加

Ruby 4.0は30周年記念リリースとして、新しいパーサー(PRISM)やJITコンパイラ(ZJIT)など、パフォーマンスと開発体験を向上させる多くの改善が含まれています。

参考リンク

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?