🔧

Dev Container + Rails + vscode-rdbg (debug.gem)

2022/09/10に公開

はじめに

Ruby 3.1で標準ライブラリになった debug.gemとVSCodeを組み合わせると、VSCodeのデバッグ機能をRubyでの開発に使えるようになります。

この記事では、最近私がよく活用するDevContainerを使ったRails開発において debug.gem を使うにはどのようにすればいよのか? 試したことをご紹介します。

debug.gem

debug.gem については開発された笹田さんの記事をご覧下さい。

https://techlife.cookpad.com/entry/2021/12/27/202133

vscode-rdbg

vscode-rdbgはVSCodeのデバッグ機能からdebug.gemを利用するためのエクステンションです。
ソースコードの左をクリックしてブレークポイントを設定でき、pryのようにコード中に仕込む必要がないのでとても便利です。
https://youtu.be/p0oHrs8B4MA

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の作り方については説明しません。

https://zenn.dev/saboyutaka/articles/9cffc8d14c6684

https://github.com/takeyuweb/rails-debug-sample/commit/678c1c2a6b6fa6ed81d56a5a504d3931d63e3d43

Dev ContainerにVSCode rdbg Ruby Debuggerエクステンションを追加します。

.devcontainer/devcontainer.json
  "extensions": [
    "KoichiSasada.vscode-rdbg"
  ],

https://marketplace.visualstudio.com/items?itemName=KoichiSasada.vscode-rdbg

Gemfileに追加する

debug.gemのREADMENOTE: If you want to use bundler (bundle command), you need to write gem debug line in your Gemfile. とありますので、追加します。

最近のRailsだとデフォルトで含まれますね。3.1標準よりも新しいバージョンのdebug.gemが入りますし、そういう点でも入れた方が良いでしょう。

Gemfile
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 を作成する

.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エラーが発生することがあります。
Puma::ConnectionError

これについてよくわかっていないのですが、ブレークポイント rescue RuntimeError のチェックを外して回避しています。Rails開発中のRuntimeErrorはエラー画面で確認できますし、rescueする必要は無いかと思っています。

設定例

この記事のもととなったコードです。
https://github.com/takeyuweb/rails-debug-sample

さいごに

Dev Containerはフル機能の開発環境というだけあり、特別な設定なくvscode-rdbgを使うことができました。

debug.gemを使用すると、VSCodeの人は簡単な設定で、とても便利にGUIによる高度なデバッグができるようになります。一方で、pry派の方やVSCodeを使っていない方も、止めたい場所にbinding.breakと記述することで、その行でデバッグコンソールが開くことができるので、プロジェクトに導入しない手は無いと思います。

このような便利なgemがRuby本体と同梱されたことで、標準のやり方となることは、とても素晴らしいと思います。

タケユー・ウェブ株式会社

Discussion