Ruby 3.2 の Rails アプリケーションで compass gem を動かす
Ruby 3.2 では File.exists?
メソッドが削除されたため、compass gem (v1.0.3) を使っている Rails アプリケーションではエラーが発生する。
.bundle/ruby/3.2.0/gems/compass-1.0.3/lib/compass/configuration/helpers.rb:89:in `block in detect_configuration_file': undefined method `exists?' for File:Class (NoMethodError)
compass gem が File.exists?
を呼んでいる箇所はこちら。
compass gem はメンテナンスが止まっているので使わないのが一番だが、時間を割けないプロジェクトではそうも言っていられない。
しかし Ruby 3.2 にアップデートできないのはもったいないので、File.exist?
のエイリアスを定義することで対応する。
まず、File
クラスに exist?
メソッドのエイリアス exists?
を定義する。特異クラス class << self
内で alias
を使うことでクラスメソッドのエイリアスを定義できる。
# lib/file_exists_patch.rb
class File
class << self
alias :exists?, :exist?
end
end
Bundler が Gem をロードする前に上記ファイルを読み込む。ロード後だとエラーになるので、config/initializers
に置いても意味がない。
# config/application.rb
require 'rails'
# Bundler.require の前に読み込む
require_relative '../lib/file_exists_patch'
Bundler.require(*Rails.groups)
以上の対応で、手元の Rails プロジェクトでは Ruby 3.2 で起動することができた。