【Ruby/Rails】LoadError: cannot load such file -- rexml/documentというエラーへの対処法と原因

最初に

RailsないしRubyを使っているときに、 LoadError: cannot load such file -- rexml/document というようなエラーがでることがある。

これの対処法や原因について、簡単に書く。

対処法

エラー文は「rexml/documentが読み込めない」と言っている。
rexml/documentとは、rexmlというgemのサブライブラリと呼ぶべきものだ。

gem 'rexml'

この行をGemfileに追記しbundle installして、rexmlを使えるようにする。

原因

Ruby 3.0 で、rexml は、Default gemからBundled gemとなった。

Default gemもBundled gemも、Rubyをインストールしたときに一緒にインストールされるgemである。
しかし、前者は、Rubyコアチームで管理されアンイストールすることは出来ず、
後者は、Rubyコアチーム外で管理されアンイストールすることができる。

どうもこの区分が変わったことで、rexmlを使う場合は使うことを明示的に指定する必要があるようだ。

仮にこちらがrexmlを直接使う気がなくても、何らかのgemを使う際にそのgemがrexmlに依存していて、
間接的にrexmlを使う必要があって、失敗することがある。
むしろ、間接的に使って失敗することの方が多いだろう。

例えば、自分はRailsrails test:allコマンドを実行するときに、失敗した。
本来なら1番rexmlに依存しているgem側のGemfileないしgemspecにrexmlを指定して欲しいところ。
自身のGemfileにrexmlを指定する以外にも、エラーが起きるgemにrexmlを指定するようにPRを送ってマージしてもらって、最新のgemを使うのが1番いい。

まぁ、PRを送ってもすぐマージされなかったりするので、結局自分のGemfileに書いておくのが1番手っ取り早い解決方法となるだろう。

参考

Standard Gems
冒頭にDefault gemsとBundled gemsの定義が書いてある。

letter_opener_web PR #106
letter_opener_webというgemはrexmlに依存している。
rexmlを明示的に指定するようPRがでているが、管理者の反応がまだない。

rails/rails Issue#41502 rails test fails with cannot load such file rexml/document
Railsでも、rexml/documentがロードできず、テストが落ちることが報告されている。