Ruby gemの中にはGhost Methodsがたくさんあるかもしれないので、Ruby gemの内部メカニズムをただで研究するのは良い考えではないと思います。ソースコードを静的に読み取る。サードパーティのgemのソースファイルを実行中のRubyプロセスに添付してデバッグし、ブレークポイントを設定して動的に動作することを確認する方法はありますか?
BTW、「require」ステートメントのコンテキストメニュー「GoTo-> Implementations」または3番目のシンボルをクリックして、RubyMineのサードパートgemのソースファイルに移動しようとしました。 -part gem(require 'watir'
など)、成功しませんでした。 IDEなどの動的型付け言語のRubyがシンボルナビゲーションに失敗するのは正常ですか?
これを行うためのより良い方法があるかどうか知りたいのですが、私が通常行う方法は次のとおりです。
bundle show gemname
を実行して宝石を見つけます。私はMacを使用しているので、通常これをpbcopyにパイプして、クリップボードにコピーします。 bundle show Rails | pbcopy
mvim /path/to/gem/directory
debugger
を挿入します。p variable_name
)を調べて、 Rubyデバッガーコマンド を使用して1行ずつ移動できます。*ブレークポイントを配置する場所を知っていると、コードをある程度理解できますが、lib /gemname.rbから始める必要があります。
現在受け入れられている回答で提案されているように、Gemファイルを編集することは避けます。代わりに、アプリファイルの1つにdebugger
コマンドを配置し、break
コマンドを使用してgemにブレークポイントを設定します。 rvm
とgemset
を使用しているので、次のようにします。
break /Users/chris/.rvm/gems/Ruby-1.9.3-p125@<gemset>/gems/<gem_name>-<gem-version>/<path_to_file>:<line_number>
どちらのコマンドも、コンピューターのgemソースへのパスを出力します。
# if it is present in your gemfile
bundle show gemname
# if not in your gemfile
gem which gemname
次に、選択したテキストエディタでフォルダを開くだけで、適切にデバッグできます。
pry
gemは私のために働きます。
bundle add pry --group "development, test"
また、binding.pry
を使用している.rbファイルにpry
が必要です。
require 'pry'
これが GitHubリンク
Rubyのように実行時にコードを変更する言語では、シンボルやメソッドなどの起源を100%正確に予測することは困難です。
私はソースコード分析を必要とする多くのサードパーティの宝石を扱っていますが、このタスクに最適なツールは Netbeans +その Ruby and Rails =プラグイン 。
**生成されたコードブロック(each {}
など)のメソッド呼び出しにいくつかの不具合がありますが、私はそれらに対処することを学びました。
私が通常行うことは、ブレークポイントを設定し、実行時にコードを分析することです。