Dev Container + Rails + vscode-rdbg (debug.gem)
はじめに
Ruby 3.1で標準ライブラリになった debug.gemとVSCodeを組み合わせると、VSCodeのデバッグ機能をRubyでの開発に使えるようになります。
この記事では、最近私がよく活用するDevContainerを使ったRails開発において debug.gem を使うにはどのようにすればいよのか? 試したことをご紹介します。
debug.gem
debug.gem については開発された笹田さんの記事をご覧下さい。
vscode-rdbg
vscode-rdbgはVSCodeのデバッグ機能からdebug.gemを利用するためのエクステンションです。
ソースコードの左をクリックしてブレークポイントを設定でき、pryのようにコード中に仕込む必要がないのでとても便利です。
Dev Container
Dev ContainerはVSCodeの機能の1つで、任意のDockerコンテナをフル機能の開発環境として利用できるようにするものです。Dockerコンテナ内でvscode-serverを起動し、ホストPC上のVSCodeから接続して使用することで、ホストPC上のVSCodeでまるでローカルホストで開発しているように扱うことができます。(vscode-serverからみればローカルなので)
この記事のゴール
- Dev Containerでデバッガを使ったRails開発できるようになる
- VSCodeの『デバッグの開始(F5)』でデバッガ付きでRails serverを起動する
設定のポイント
Dev Container
こちらの記事や私のサンプルを参考に使いやすいように作れば良いでしょう。この記事ではDev Containerの作り方については説明しません。
Dev ContainerにVSCode rdbg Ruby Debuggerエクステンションを追加します。
"extensions": [
"KoichiSasada.vscode-rdbg"
],
Gemfileに追加する
debug.gemのREADMEに NOTE: If you want to use bundler (bundle command), you need to write gem debug line in your Gemfile.
とありますので、追加します。
最近のRailsだとデフォルトで含まれますね。3.1標準よりも新しいバージョンのdebug.gemが入りますし、そういう点でも入れた方が良いでしょう。
group :development, :test do
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
gem "debug", platforms: %i[ mri mingw x64_mingw ]
end
.vscode/launch.json を作成する
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "rdbg",
"name": "Run rails server",
"rdbgPath": "bundle exec rdbg", // Use the debug.gem described in the Gemfile
"request": "launch",
"command": "bin/rails", // Breakpoints do not work with "rails".
"script": "s", // launch rails server with debugger
"args": [],
"askParameters": false // Do not ask startup parameter any more
}
]
}
"rdbgPath": "bundle exec rdbg"
Gemfile記載のdebug.gemを使う。
この指定が無いと、Ruby 3.1同梱のdebug.gemの依存関係に関する問題が生じました。
/usr/local/lib/ruby/3.1.0/bundler/runtime.rb:309:in `check_for_activated_spec!': You have already activated timeout 0.2.0, but your Gemfile requires timeout 0.3.0. Since timeout is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports timeout as a default gem. (Gem::LoadError)
"command": "bin/rails"
command: rails
でも起動はするのですが、その場合VSCode上でブレークポイントを設定しても停止しませんでした。
rescue RuntimeError のチェックを外す
デバッガ使用中にPuma::ConnectionError
エラーが発生することがあります。
これについてよくわかっていないのですが、ブレークポイント rescue RuntimeError
のチェックを外して回避しています。Rails開発中のRuntimeErrorはエラー画面で確認できますし、rescue
する必要は無いかと思っています。
設定例
この記事のもととなったコードです。
さいごに
Dev Containerはフル機能の開発環境というだけあり、特別な設定なくvscode-rdbgを使うことができました。
debug.gemを使用すると、VSCodeの人は簡単な設定で、とても便利にGUIによる高度なデバッグができるようになります。一方で、pry派の方やVSCodeを使っていない方も、止めたい場所にbinding.break
と記述することで、その行でデバッグコンソールが開くことができるので、プロジェクトに導入しない手は無いと思います。
このような便利なgemがRuby本体と同梱されたことで、標準のやり方となることは、とても素晴らしいと思います。
Discussion