Ruby LSPの不具合によって "`require': linked to incompatible"(LoadError)が発生する
実行環境
- 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
でバージョン切り替え
- 以前は、3.2.1 を使用しており、プロジェクトの Ruby のバージョンに合わせるため、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