ryufutaの学習ブログ

微経験からプログラマを目指して学んだことを中心に書いていきます

ruby-lspのバグが原因で作られた~/.gemによってrails newが失敗する

はじめに

記事の内容はタイトルの通り。
この記事で取り上げるrails newのエラーはruby-lspのバグが原因だったのですが、このバグは既に修正されているため今後発生することはないかと思います。

実行環境

発生した問題

rails newを実行すると以下のエラーで失敗。

$ rails new
(省略)
bin/rails aborted!
LoadError: dlopen(/Users/user/.gem/ruby/3.2.0/gems/debug-1.9.2/lib/debug/debug.bundle, 0x0009): Library not loaded: /Users/user/.rbenv/versions/3.2.2/lib/libruby.3.2.dylib (LoadError)
  Referenced from: <6E739541-8BEB-32C0-8E12-6E3D21ED55B6> /Users/user/.gem/ruby/3.2.0/gems/debug-1.9.2/lib/debug/debug.bundle
  Reason: tried: '/Users/user/.rbenv/versions/3.2.2/lib/libruby.3.2.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/Users/user/.rbenv/versions/3.2.2/lib/libruby.3.2.dylib' (no such file), '/Users/user/.rbenv/versions/3.2.2/lib/libruby.3.2.dylib' (no such file) - /Users/user/.gem/ruby/3.2.0/gems/debug-1.9.2/lib/debug/debug.bundle
<internal:/Users/user/.rbenv/versions/3.2.3/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:38:in `require'
<internal:/Users/user/.rbenv/versions/3.2.3/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:38:in `require'
/Users/user/.gem/ruby/3.2.0/gems/debug-1.9.2/lib/debug/frame_info.rb:16:in `rescue in <module:DEBUGGER__>'
/Users/user/.gem/ruby/3.2.0/gems/debug-1.9.2/lib/debug/frame_info.rb:13:in `<module:DEBUGGER__>'
/Users/user/.gem/ruby/3.2.0/gems/debug-1.9.2/lib/debug/frame_info.rb:three:in `<main>'
/Users/user/.gem/ruby/3.2.0/gems/debug-1.9.2/lib/debug/session.rb:31:in `require_relative'
/Users/user/.gem/ruby/3.2.0/gems/debug-1.9.2/lib/debug/session.rb:31:in `<main>'
/Users/user/.gem/ruby/3.2.0/gems/debug-1.9.2/lib/debug.rb:six:in `require_relative'
/Users/user/.gem/ruby/3.2.0/gems/debug-1.9.2/lib/debug.rb:six:in `<main>'
(省略)

エラーを見ると

  1. ~/.gem/ruby/3.2.0にgemを探しに行く
  2. 削除済みの~/.rbenv/versions/3.2.2に動的ライブラリを探しに行く
  3. no such fileで失敗

となっています。

解決方法

$ rm -r ~/.gem/ruby/3.2.0

で問題の発端となっているディレクトリを削除して解決。

※追記
エラー自体はこれで解決しますが、「根本原因」に記載しているように先にruby-lspをv0.5.20以上にしておく方が良いかもしれません。

根本原因

問題の~/.gem/ruby/3.2.0ruby-lsp v0.5.19のバグが原因で作成されたディレクトリでした。
修正版は2024/4/25にv0.5.20としてリリースされています。 https://github.com/Shopify/ruby-lsp/releases/tag/vscode-ruby-lsp-v0.5.20

問題のディレクトリは削除しても、VS Codeを起動すると自動的に再作成されていたのですが、ruby-lspを再インストールして最新版にした後、再度削除したところ、作成されなくなりました。
また、ruby-lsp再インストール前の時点で~/.gem/ruby/3.2.0/gemsにあったgemは全て~/.rbenv/versions/3.2.3/lib/ruby/gems/3.2.0/gemsに移っています。

よって上記のrails newのエラーは今後発生することはないと考えられます。

gemのインストール先についての補足

gemのデフォルトのインストール先は

$ gem env home

で確認できます。
rbenvを使用している場合は~/.rbenv/versions/version/lib/ruby/gems/...のように表示されます。
(私の環境では~/.rbenv/versions/3.2.3/lib/ruby/gems/3.2.0

一方で、

$ gem install GEMNAME --user-install

とするとユーザーごとにgemがインストールされます。
このときのインストール先は

$ gem env user_gemhome

で確認できます。
(私の環境では~/.gem/ruby/3.2.0

ですので、--user-installを指定してインストールしたことがある方はruby-lspのバグとは関係なく今回問題になっていたディレクトリが作成されていると思います。

参考
Command Reference - RubyGems Guides
rbenv/rbenv: Manage your app's Ruby environment

おわりに

エラーの根本原因の特定にあたってフィヨルドブートキャンプのメンターであるid:JunichiItoさんにお世話になりました。
ありがとうございます🙏