Rubyのソースコードを読むとき、grepやctagsだけで読んでるとどこにどういう値が入るのか頭で考える必要があり大変。
そういう時、実際に動かしながらpryを使って中身を確認すると、どういう動きをしているのか楽に把握できる。
普通のエディタを使ってRubyを書いている人にとって、IDE的な機能を提供してくれるのがpryといえる。
本稿では、この記事を書く前の私のように、この次の「最低限の使い方」くらいしかpryを使いこなせていない人向けに、便利な機能をひと通り説明する。
最低限の使い方
まだpryを使ったことがない人はこれだけ知ってれば十分な気がする。
binding.pryで任意の場所からREPLを立ち上げる
ソースの任意の箇所にbinding.pry
を書いてRubyのプログラムを走らせると、実行中にその行でストップしてpryのREPLが立ち上がり、その環境での変数がどうなっているかなどが参照できる。
アプリが原因不明のエラーを出している時、落ちている直前にbinding.pry
を挟んで原因を調査したり、テストが落ちている原因の特定などに便利。
pry標準の機能
irbとは違った使い方ができるよう、pryの便利な機能をよく使いそうな順に紹介する。
?
, show-doc, ri, $
, show-method
?
やshow-docを使うとドキュメントを見ることができる。riはriコマンドを実行する。
$
やshow-methodを使うとメソッドの定義を見ることができるが、CRubyのソースを見たいときはpry-doc gemをインストールする必要がある。
ドキュメントもソースコードもpry内で見れてしまうので、ブラウザを開く必要がなくなる。
edit
今はまだどこにソースがあるかがわからないところにbinding.pryを貼りたいことがある。
editを使うとpryで定義場所を調べたあとエディタでそれを開くみたいなコストが減らせる。
あとは周辺をそのまま読みたいときにも便利。
エディタは$EDITORをいじるか.pryrcにPry.editor = 'vim'
とか書けば変えられる。
cd, ls, Tab補完
pryも普通のシェルと同じようにcd, lsやタブキーによる補完がある。
cdを使うとコンテキストを移動できる。上の画像ではmainからAcitveRecord::RelationやArelの内側に入っている。
lsは現在のコンテキストにおけるメソッドや変数の一覧が見れる。
メソッドの一覧だけ見たいときはls -m
。ls --grep
で絞込ができる。
exit!, !!!, exit-program, disable-pry, edit -m
何度も呼ばれるメソッドやループの内側にbinding.pryを書いて何度もブレークして困った事がある人は多いと思う。
一番楽で乱暴な方法はexit!, !!!, exit-programでプロセスを終了してしまうことである。でもこれだと例えばrails s上でやるとrails sが落ちる。
disable-pryは以降pryが完全に無効になるのでプロセスは死なないけど、以降binding.pryが使えなくなる。
多分一番健全な方法は、ちょっと面倒だけどedit -mで現在のメソッドからbinding.pryを取り除くことだと思う。
.
とshell-mode
「.」で始めると以降をシェルのコマンド入力として受け付ける。画像のように#{}
の式展開が使える。
shell-mode
を使うとカレントディレクトリを表示してくれるのと、ファイル名補完が有効になる。
help
単にRubyの式を評価するだけでなく、pryには独自のコマンドが存在する。その全リストをhelp
コマンドで確認することができる。
セクションごとに分けて表示してくれるので、例えばpry-railsプラグイン特有の機能のリストを見たいときなどに役に立つ。
各コマンドは-h
(--help
)をつけると使い方を見ることができる。
余力がある人はhist
, find-method
, whereami
(@
), nesting
あたりは見ておくと良いと思う。
便利なプラグイン
pryにはプラグインがたくさんある。 ★
個人的には以下の3つだけ知ってれば十分だと思うので、これらを紹介したい。
pry-byebug
古代のRuby向けに作られたpry-navとpry-debuggerの後継がpry-byebug。
ステップ実行など、デバッガとしてちゃんとpryを使いたい場合はこれが必要になる。
以下のコマンドだけ覚えておけば良い。
コマンド | 操作 |
---|---|
step | メソッドの内部に入る |
next | 現在のメソッド内で1行進める |
finish | 現在のメソッドを抜ける |
continue | デバッグを抜ける |
下記を書いておくとエンターを押すだけで前のコマンドを繰り返せるようになる。
# Hit Enter to repeat last command
Pry::Commands.command /^$/, "repeat last command" do
_pry_.run_command Pry.history.to_a.last
end
~/.pryrc
でコマンドのエイリアスを定義しておくと使いやすくなる。
if defined?(PryByebug)
Pry.commands.alias_command 's', 'step'
Pry.commands.alias_command 'n', 'next'
Pry.commands.alias_command 'f', 'finish'
Pry.commands.alias_command 'c', 'continue'
end
pry-stack_explorer
show-stack
してスタックのリストを出しframe [数字]
とやると任意のスタックにコンテキストを移動できる。up
, down
でスタックフレームを上下に移動できる。
これも~/.pryrc
でエイリアスすると使いやすくなる。
if defined?(PryStackExplorer)
Pry.commands.alias_command 'bt', 'show-stack'
end
pry-rails
rails cを置き換えるのがメインで、いくつかは機能がrake taskとかぶっている。
それでも一応使いそうなのを紹介しておく。
show-routes
とにかく実行がめちゃくちゃ速い。spring rake routes
より速いので良い。-G
(--grep
)で絞り込む。
単にパスがどう引っかかるか調べたいときはrecognize-path
を使う。
show-model, show-models
schema.rbとかを開かなくてもスキーマが確認できるので便利。
show-modelsを使うと全部表示される。
reload!
rails cを再起動しなくて済む。