前置き
RubyMine入門したての @rakudalms です。
定義ジャンプが強力過ぎてもうRubyMine無しでは開発したくないほどに惚れ込んでおりますw
さて本題ですがIntelliJ系IDEをお使いの皆さん puma-dev
環境でのデバッグどうしてますか?
色々な記事を参考にしたり先輩に聞いたりして3つの方法を検証しましたので共有させていただきます。
RubyMineでの検証しかしていませんが他のIntelliJ系IDEでも方法1と方法3は参考になると思いますたぶん。
対象読者
puma-dev
のサーバー起動を自動起動設定(Railsアプリのシンボリックリンクを貼るやり方)にしているけどデバッグってどうやんの?て方。
環境
MacBook Pro 14インチ, 2021(M1)
mac OS 13.3.1 (Ventura)
RubyMine 2022.3.2
先に結論!
結論から言うと、余計な設定が全くいらない方法3が個人的には最適解なんじゃないかなと思ってます。
ただ個々人の環境によって違うとは思うのでそれぞれ試してみて1番しっくりくるものを選んで頂けたらと思います。
解説
ここからは各方法の解説をしていきます。
方法1. RubyMineの Attach to Process
で puma-dev
のプロセスに直接アタッチ
この方法や puma-dev
に関しては @jnchito さんが超わかりやすい記事を公開してくれています。
(いつも分かりやすい記事感謝です🙏)
以下冒頭引用
RubyMine 2016.3から、ローカルで動いているRubyプロセスにアタッチしてデバッグ実行できる機能が追加されました。
これにより、PowやPuma-devで動いているRailsアプリに対してもRubyMineからアタッチしてデバッグ実行することができます。
とある通り Run
> Attach to Process
で起動中の puma-dev
プロセスに直接アタッチできます。
ただ @jnchito さんも書いてるのですが、アタッチまでにクセがありうまく繋げないことも。
使いこなせる方はRubyMine標準となった機能ですしこれが1番良さそうな気がします。
私の場合は成功率が低かったので更に他の方法を検証していきます。
方法2. Railsアプリ上で自作Debuggerを起動させてRubymineの Ruby remote debug
を実行
次に @rakuma_devrel さんの以下の記事を参考にして試してみた結果です。
正しいやり方・お作法かは置いておいて私のやった手順を紹介します。
1) デバッグ用のgemをインストール
@rakuma_devrel さんの記事ではgemをローカルインストールしてましたがとりあえず私はGemfileに記載
gem 'ruby-debug-ide'
gem 'debase-ruby_core_source'
gem 'debase'
その後 bundle install
$ bundle install
2) Rails起動で必ず実行されるRubyファイルにDebuggerコードを仕込む
私の場合は、 config/initializers
配下に remote_debugger.rb
を作ってその中にコードを書きました。
Rails起動で必ず実行されるファイルであれば何でもOKです(極端な話、application_controller.rb
とかに仕込むとかでも。一応試し済)
ruby_home = `which ruby`.strip.split('/')[0..-3].join('/')
debase_path = Dir[ruby_home + '/lib/ruby/gems/*/gems/debase-0*'][-1]
debug_ide_path = Dir[ruby_home + '/lib/ruby/gems/*/gems/ruby-debug-ide-0*'][-1]
$LOAD_PATH.push(debase_path + '/lib')
.push(debug_ide_path + '/lib')
require 'ruby-debug-ide'
begin
TCPSocket.new('127.0.0.1', 1235).close
rescue Errno::ECONNREFUSED => e
Debugger.start_server nil, 1235
else
p 'Debugger.start_server failed. port is already in use'
end
上記の 1235
がこのDebuggerのポート番号です。ユニークであれば任意の番号でOK。後ほど使います。
3) Rubymineで Ruby remote debug
のConfigurationを作成
左上の +
ボタン押下 > Ruby remote debug
を選択
4) puma-dev
サーバーの再起動
$ puma-dev -stop
5) RubyMine
の remote debugger
を起動
Rubymine の Run
> Debug 'remote debugger'
(3で作ったやつ)を実行
Debug Tool Window の Variables
に Connected
と表示されていたら接続成功です。
接続時のクセもなく成功率100%でデバッグ可能です。
ただ、gemをインストールする必要があったり、デバッグコードを仕込んだりする必要があるのが難点だと思います。
もう少し他の方法がないか社内MTGの後半で先輩エンジニアに質問。
これで下記の個人的最適解にたどり着きました。
方法3. 【個人的最適解】 puma-dev
をプロキシモードで起動するようにする
この方法だと、方法2のようにファイルも汚さないし、 rails s
でサーバー起動するだけで簡単にデバッグ出来るようになるのでかなり良さそう。
手順は以下の通り
1) puma-dev
の設定をプロキシモードでの起動に変更する
# .puma-devディレクトリに移動
$ cd ~/.puma-dev
# シンボリックを解除
$ unlink MY_APP
# `rails s` のポート番号が書いてあるだけのファイルを作成
$ touch MY_APP; echo 3001 >> My_APP
※ MY_APP
は自分のRailsアプリ名(リポジトリ名)に置き換えてください
※ 3001
の部分は rails s
時のサーバーのポート番号なので自身の環境でお好みに
これで puma-dev
のサーバー起動設定がプロキシモードになりました。
2) RubyMineで起動するサーバーのポート番号を変更
rails s
のポートをデフォルト(3000)以外にしている場合はRubymine上のサーバーのポート設定も変更します
Run
> Edit Configuration
> Rails
> rails server
> Port:
※ rails server
は自身の環境により名前が違いますたぶん(Rubymine で最初にプロジェクトを開いたらデフォルトで作成される?やつです)
3) RubyMineでサーバー起動
後は Rubymine 上で Run
> rails server
を起動(ショートカット設定しとくと楽)
なんともうこれでデバッグできる状態になってます。
ブレークポイント貼って好きなだけデバッグしましょう!
すごくないですか?たったこれだけです!超簡単!!
まとめると
- 接続のクセなし(100%繋がります)
- プロジェクト上にファイルを増やす必要なし
- 新たにgemをインストールする必要なし
- RubyMine上に余計なConfigurationを作る必要なし
ようするに puma-dev
を使ってない状態と全く同じようにデバッグ出来るのです!!!
以上の理由から今回のデバッグ方法模索の旅は終了、方法3を私の中での最適解とさせていただきます。
補足
本編であまり触れてなかった puma-dev
のサーバー起動モードについての補足をしておきます。
puma-dev
の起動モードには2種類あり、ブラウザでRailsアプリへのアクセス時に .puma-dev/
配下にあるアプリ名を見に行っていてそれの中身がシンボリックリンクかポート番号が書いてあるかでモードを振り分けているようで、
- シンボリックリンク → 自動で該当アプリの
puma-dev
が起動(rails s
不要) - ポート番号(プロキシモード) → 通常通り手動で
rails s
でのサーバー起動が必要
という挙動の違いがあります。
今までプロキシモードでのサーバー起動って結局 rails s
しなきゃだしなんでこれにする必要あるの?って思ってましたが、今回の検証をしたことで納得出来ました。
RubyMineにはRailsサーバーと一緒に起動させたいスクリプトをまとめる機能(Compound)があるので、そもそも自動で起動させずに自身でサーバーの起動をコントロールした方が良い点もあることも教わりました。
もちろんプロキシモードにすると puma-dev
の利点である自動起動がしなくなるので、方法1で問題なく puma-dev
サーバーにアタッチ出来る人は方法1がベストな気もしてます。
あとがき
長々書きましたが、ネット上にある情報をそれぞれ比較検証してみました。
一長一短ですが、サーバーが自動で起動しないのと引き換えにRubyMineでデバッグしやすくなるならそれは大きな利点だと思います。
色々勉強になりましたし、なによりRubyMineがより一層好きになりましたw
この記事によって皆様の開発の一助になれば幸いです🙇🏻