ご挨拶
地球の皆さん、おはこんばんちは! 青い地球に住む青いゾウのLEFと申します。🐘
VSCodeを使っていて、自分が遭遇したとあるエラーの解決法について説明致します。
※今回はRuby Debuggerでエラーが出たときの解決法を書いていますが、他のデバッグ拡張機能でエラーが出たときも、同じような方法で解決できると思います。
概要
自分は開発環境をWSL2で整えていて、統合開発環境を使いたいときにはVSCodeを使っているのですが、今回VSCodeで原因不明の事象が発生しました。
具体的には、VSCodeでデバッグしようとしたとき(「実行とデバッグ」ボタンを押したとき)に表示される、このエラーについてです。
Error: exit code is 1 Make sure to install rdbg command (`gem install debug`). If you are using bundler, write `gem 'debug'` in your Gemfile.
エラー文の通りに、gem install debug
を実行したのですが、どうやっても解決しませんでした。
自分はWSL2に開発環境を用意しているので、WSL2(Linux)とWindowsの両方でコマンドを実行し、PATHも確認したのですが、なぜかエラーが直りませんでした。
WSL2のターミナル(zshやbash)や、Windowsのターミナル(PowerShellやコマンドプロンプト)から、コマンドでrdbg
と打てば、ターミナル上では普通に起動します。
つまり、VSCodeの拡張機能のデバッガーだけに、何かしらの問題が発生しているようです。
結論
結論から言いますと、このエラーを解決するためには、2つの操作が必要です。
WSL2に追加のgemを入れる
Remote WSLを起動し、そちらの画面でデバッグを開始する
解説と手順
順を追って説明致します。
VSCodeには、デバッグを開始するための機能が、初めから備わっています。
更に、CodeRunnerという、簡単にコードを実行できる拡張機能が標準で装備されています。
それとは別に、VSCode上では、好きなターミナルを表示させることができます。
PowerShellでもコマンドプロンプトでもGitBashでもWSL2(Debian)でもWSL2(Ubuntu)でも、好きなターミナルを表示させて、それを実行することができます。
そのため、PowerShellでは動かないものであっても、WSL2(Debian)を使って、VSCode上でコードを実行できるというわけです。
しかし、ここに勘違いしやすい落とし穴があります。
それは、VSCodeの「デバッグを実行」は、ターミナルとは関係なく、起動しているOS上でおこなわれるということです。
つまり、VSCodeでWSL2のターミナルを表示させ、そこで色々コマンドを実行できるようにしていても、デバッグを実行したりCodeRunをおこなってCodeRunnerを起動させると、強制的にWindows側のほうでコードが実行されるのです。
この基本的な仕様を、自分は今まで理解していませんでした。
そのため、VSCodeそのものがコードを動かすときに、もっと緊密な形でWSL2と接続する必要があります。
つまり、VSCodeそのものを、WSL2上で動かす必要があります。
そのためには、Remote - WSLという拡張機能を入れる必要があります。
そして、ここが自分が勘違いした大事なポイントなのですが、Remote - WSLを入れているだけでは、Remoteへ接続されないということです。
この拡張機能を入れるだけではなく、この拡張機能を実行し、新しいVSCodeを開いた上で、そこで自分が使いたいディレクトリ(フォルダ)を開く必要があります。
(拡張機能を入れていれば、自動的にWSL2へと接続されるものだと自分は思い込んでいました)
このとき、ディレクトリをドラッグして開こうとすると、Windows側のVSCodeで開いちゃうことがあります。そのため、/
を使って、直接フォルダの場所をタイプする必要があります。
Remote - WSLに切り替わっているかどうかは、左下に表示されています。
そして、Remote - WSLの側では設定や拡張機能が初期状態のままなので、必要に応じて拡張機能をインストールすることも必要です。
というのも、WSL2の上では、拡張機能はまだインストールされていないからです。
繰り返しになりますが、Remote - WSLとは、WSL2上でVSCodeを起動(展開)させることです。
つまり、Windows上でVSCodeを起動させるのとは、本質的にまったく異なるというわけです。
普通にVSCodeを展開させるだけだと、WSL2のターミナルは開けますが、Windowsで起動しているため、対象のPATHが見つからず、エラーが出てしまったというわけです。
※Windows側の設定をたくさんいじれば、Windows側で起動したままエラーが解決するのかもしれませんが、かなり複雑そうであり、自分では解決しそうになかったので、今回は取り上げません。
→もし、Windows側で起動したままエラーを解決する方法があれば、ぜひコメント欄などで教えていただけると嬉しいです!
と、いうわけで、Remote - WSLを起動する必要があるのですが、もうひとつだけおこなうことがあります。
それは、追加のgemをWSL2へと入れることです。
(WSL2のほうにインストールします)
公式で指示されている、gem install debug
のほかにも、入れておいたほうが良いgemがあります。
具体的には
$ gem install ruby-debug-ide $ gem install debase
をして、追加のgemを入れておく必要があります。
自分はこの追加gemを入れる前にデバッグを実行してみたら、エラーが出たままでした。
とりあえず入れてみるのが良さそうです。
ついでに、gemもアップデートしておくと安心かもしれません。
$ gem update --system $ gem update
そして最後は、デバッグをしたい行の左に赤ポチををつけて、そして「デバッグを実行」を押せば、無事、エラーが出ずにデバッグを開始することができます。
まとめ
自分がRemote -WSLの挙動を正しく理解していないのが主な原因でした。
VSCodeの仕組みは意外と難しく、単なるエディタではなく、あくまでIDEだということを気に留める必要があります。
基本的に、WSL2で開発環境を整えているならば、毎回このRemoteのほうでVSCodeを起動したほうが良さそうです。
また、改めて質問することの重要性を理解しました。
もし、今回のエラーを「ターミナルでは普通に動くし、解決しなくてもいいや! 放置放置~♪」って投げ出していたら、このようなVSCodeの仕組みを理解しないまま突き進んでしまい、もっと大きなエラーにぶつかったときに、途方に暮れてしまっていたでしょう。
今の段階の、まだ本格的にコードを書き始める前に、理解することができたのは僥倖でした。
感謝とお礼
このエラーは、フィヨルドブートキャンプのkomagataさんと yocajiiさんに、質問雑談タイムで助けていただきました。ありがとうございました!🙏
もし、自分一人でこのエラーに遭遇していたら、諦めてしまっていたと思います。😅
また、WindowsではなくMacですが、同じエラーに関して、jnchitoさんがフィヨルドブートキャンプ内のQ&Aで他の方に回答されていました。その情報もとても参考になりました。✨