← Blog

Workaround für File.exists? und Dir.exists? in Ruby 3.2

Wenn Sie auf Ruby 3.2 aktualisieren, sehen Sie vielleicht diesen Fehler:

irb(main):001:0> File.exists?
(irb):1:in `<main>': undefined method `exists?' for File:Class (NoMethodError)
Did you mean?  exist?
        from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/irb-1.6.2/exe/irb:11:in `<top (required)>'
        from C:/Ruby32-x64/bin/irb:25:in `load'
        from C:/Ruby32-x64/bin/irb:25:in `<main>'

Oder jenen für Dir.exists?

(irb):3:in `<main>': undefined method `exists?' for Dir:Class (NoMethodError)
Did you mean?  exist?
        from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/irb-1.6.2/exe/irb:11:in `<top (required)>'
        from C:/Ruby32-x64/bin/irb:25:in `load'
        from C:/Ruby32-x64/bin/irb:25:in `<main>'

Am besten verwenden Sie einfach File.exist? und Dir.exist? statt File.exists? und Dir.exists?,
denn diese sind spätestens seit Ruby 2.3 veraltet und wurden in Ruby 3.2 entfernt.

Oft wurden diese Methoden in Gems verwendet, die sich nicht einfach aktualisieren lassen. Zum Glück nutzen wir Ruby, und so gibt es einen einfachen Workaround, den ich in ein Gem gepackt habe.

So funktioniert der Monkeypatch:

class File
  def self.exists?(filename)
    self.exist?(filename)
  end
end

Das muss vor jedem Code laufen, der die Methode File.exists verwendet.
Um es einfacher zu machen, habe ich es ins Gem file_exists gepackt.

Einfach

gem install file_exists

und mit

require 'file_exists'

vor allem anderen Code einbinden.