🚨

Ruby LSPの不具合によって "`require': linked to incompatible"(LoadError)が発生する

2024/06/04に公開

実行環境

  • macOS
  • Apple Silicon
  • Visual Studio Code
    • 拡張機能に ruby-lsp をインストール
  • rbenv
  • Ruby 3.2.2
    • 以前は、3.2.1 を使用しており、プロジェクトの Ruby のバージョンに合わせるため、3.2.2 をインストールして、rbenv local 3.2.2でバージョン切り替え

発生した問題

Rails アプリのセットアップのため、bin/setup コマンドで環境セットアップを実行したところ、以下のようなエラーが発生する場合があります。

$ bin/setup 
== Installing dependencies ==
Ignoring psych-5.1.2 because its extensions are not built. Try: gem pristine psych --version 5.1.2
Ignoring stringio-3.1.0 because its extensions are not built. Try: gem pristine stringio --version 3.1.0
<internal:/Users/mikoto/.rbenv/versions/3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:148:in `require': linked to incompatible /Users/mikoto/.rbenv/versions/3.2.1/lib/libruby.3.2.dylib - /Users/mikoto/.gem/ruby/3.2.0/gems/psych-5.1.2/lib/psych.bundle (LoadError)
        from <internal:/Users/mikoto/.rbenv/versions/3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:148:in'require'`
        from /Users/mikoto/.gem/ruby/3.2.0/gems/psych-5.1.2/lib/psych.rb:13:in `<top (required)>'
        from <internal:/Users/mikoto/.rbenv/versions/3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:148:in `require'
        from <internal:/Users/mikoto/.rbenv/versions/3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:148:in `require'
        from /Users/mikoto/.rbenv/versions/3.2.2/lib/ruby/3.2.0/rubygems.rb:608:in `load_yaml'
        from /Users/mikoto/.rbenv/versions/3.2.2/lib/ruby/3.2.0/rubygems/config_file.rb:346:in `load_file'
        from /Users/mikoto/.rbenv/versions/3.2.2/lib/ruby/3.2.0/rubygems/config_file.rb:189:in `initialize'
        from /Users/mikoto/.rbenv/versions/3.2.2/lib/ruby/3.2.0/rubygems/gem_runner.rb:71:in `new'
        from /Users/mikoto/.rbenv/versions/3.2.2/lib/ruby/3.2.0/rubygems/gem_runner.rb:71:in `do_configuration'
        from /Users/mikoto/.rbenv/versions/3.2.2/lib/ruby/3.2.0/rubygems/gem_runner.rb:33:in `run'
        from /Users/mikoto/.rbenv/versions/3.2.2/bin/gem:10:in `<main>'

== Command ["gem install bundler --conservative"] failed ==

エラーの解説

上の以下の部分は、エラーが発生したファイルと行番号を示しています。この場合、エラーは RubyGems のcore_ext/kernel_require.rb ファイルの 85 行目で発生しています。require メソッドを呼び出そうとした際にエラーが発生したことを示しています。<internal:/Users/mikoto/.rbenv/versions/3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:148:in 'require':

続く以下の部分は、リンクしようとしたライブラリが互換性がないことを示しています。具体的には、Ruby のバージョン 3.2.2 を使用しているはずなのに、バージョン 3.2.1 の libruby.3.2.dylib ライブラリにリンクしようとしているため、互換性の問題が発生しています。
linked to incompatible /Users/mikoto/.rbenv/versions/3.2.1/lib/libruby.3.2.dylib

解決策

bin/setup コマンドを実行時に ~/.gem に gem をインストールされようとしていますが、通常は、~/.gem に gem をインストールする必要はありません。以下の手順で ~/.gem ディレクトリを削除またはリネームします。

ディレクトリを削除する場合

$ rm -r ~/.gem

ディレクトリをリネームする場合

原因調査のために削除を避けたい場合は、ディレクトリをリネームしても参照されなくなります。

$ mv ~/.gem ~/.gem.bak

このエラーが発生する理由

~/.gem は、VS Code の Ruby LSP エクステンションの v0.5.19 のバグで作成されるディレクトリです。Ruby LSP エクステンションは ~/.gem にの実行に必要なgemをインストールします。

再発防止策

今後エラーが発生しないようにするには、Ruby LSP エクステンションを最新版にアップデートします。VS Code の拡張機能で、Ruby LSP のバージョンを確認、v0.5.19 以下であれば、v0.5.20 以上(できれば最新版)にアップデートします。修正版は 2024/4/25 に v0.5.20 としてリリースされています。
Shopify Ruby LSP リリースノート

参考

謝辞
今回のエラーを解決するにあたり、フィヨルドブートキャンプメンターの伊藤淳一さんに原因や解決策をご教示いただきました。この場を借りて感謝申し上げます。
ありがとうございます。🙇‍♂️

Discussion