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 で起動することができた。

© 2023 暇人じゃない. All rights reserved.