ruby-lspのバグが原因で作られた~/.gemによってrails newが失敗する
はじめに
記事の内容はタイトルの通り。
この記事で取り上げるrails newのエラーはruby-lspのバグが原因だったのですが、このバグは既に修正されているため今後発生することはないかと思います。
実行環境
- macOS
- Visual Studio Code
- rbenv
- Ruby 3.2.3
- ただし、以前は3.2.2を使用しており、そちらはアンインストール済み
発生した問題
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>' (省略)
エラーを見ると
~/.gem/ruby/3.2.0
にgemを探しに行く- 削除済みの
~/.rbenv/versions/3.2.2
に動的ライブラリを探しに行く no such file
で失敗
となっています。
解決方法
$ rm -r ~/.gem/ruby/3.2.0
で問題の発端となっているディレクトリを削除して解決。
※追記
エラー自体はこれで解決しますが、「根本原因」に記載しているように先にruby-lspをv0.5.20以上にしておく方が良いかもしれません。
根本原因
問題の~/.gem/ruby/3.2.0
はruby-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さんにお世話になりました。
ありがとうございます🙏