Bundlerのデバッグは難しい場合がありますが、諦めないでください 🤗。
デバッグを試みる前に、開発環境設定のドキュメントに従っていることを確認してください。
最も簡単なデバッグ方法は、デバッグ情報を出力することです。オブジェクトや変数を確認したい箇所にputs
ステートメントを挿入すると、コンソール出力にputs
の内容が表示されます。
これは特にテストを実行する際に役立ちます。
ruby puts "stacktrace: #{caller_locations(0).join("\n")}" puts "@definition: #{@definition}" puts "specification.class.name: #{specification.class.name}" puts "spec.method(:to_checksum).source_location: #{spec.method(:to_checksum).source_location}" # etc
デバッグ出力戦略の詳細については、[TODO: ドキュメントへのリンク]
REPL(Read-Eval-Print Loop)は、コードを対話的に実行する方法です。
REPLを使用すると、オブジェクトや変数の値、スタックトレース、メソッドの定義場所などを確認できます。
REPLを使用するには、確認したい箇所にbinding.irb
を配置します。コードがブレークポイントに到達すると、対話型のirb
コンソールが開きます。
IRBの使用方法の詳細については、[TODO: ドキュメントへのリンク]
インタラクティブデバッグは、REPLにコードを1行ずつ実行する機能を追加したものです。
Bundlerをローカルでテストする場合、使い慣れたデバッガを使用してインタラクティブデバッグを行うことができます。
debug
と pry-byebug
がよく使用されます。debug
はRuby v3.1以降に標準搭載されています。
選択したデバッガgemをグローバルにインストールする必要があります。その後、ローカルのBundlerを実行する前に、コマンドラインでそれをrequireする必要があります。
bash RUBYOPT=-rdebug dbundle # debug gemの場合 RUBYOPT=-rpry-byebug dbundle # pry-byebugの場合
注意 テストスイートではインタラクティブデバッグはできません。ほとんどのテストはOpen3を使用してBundlerをサブプロセスで実行し、出力を文字列に取り込みます。そのため、pryをロードできたとしても、使用することはできません。
ローカルでテストする最も簡単な方法は、Gemfileを含むディレクトリを作成し、Bundlerシェルエイリアスを実行することです。(エイリアスの設定手順については、開発環境設定のドキュメントを参照してください)。
ローカルテストが誤ってコミットされないように、このディレクトリをtmp
内に配置することをお勧めします。
bash cd tmp mkdir [ローカルテスト用ディレクトリ名] && cd [ローカルテスト用ディレクトリ名] dbundle init
これで、テストに必要なGemfileを編集できるようになります。
デフォルトでは、初期化されたGemfileのリモートは"https://rubygems.org"
です。rubygemsでホストされているgemを追加し、Bundlerシェルエイリアス(dbundle
)を実行してコードをテストできます。
```ruby # frozen_string_literal: true
source “https://rubygems.org”
gem ‘tiny_css’ ```
デバッガを一時停止させたい場所にブレークポイントを配置します(debug
の場合はbinding.break
、pry-byebug
の場合はbinding.pry
)。Bundlerシェルエイリアスを実行します。
bash RUBYOPT=-rdebug dbundle
ブレークポイントがコンソールに表示され、一時停止します。
テストしたい非常に具体的なシナリオがある場合(テストスイートの実行中に失敗した例など)、最も簡単な方法は、前回のテストスイート実行からのtmp gemを使用することです。
まだ並列でテストスイートを実行していない場合は、実行します。
bash bin/parallel_rspec
ビルドされたgemはbundler/tmp
ディレクトリ(例:bundler/tmp/1/gems/remote1/
)にあります。
テスト実行からビルドされたgemを指すファイルソースを使用してGemfileを設定できます。
```ruby # frozen_string_literal: true
source “file:///[リポジトリのbundlerディレクトリへのパス]/tmp/1/gems/remote1/”
gem “rack”, ‘=0.9.1’ ```
その後、RubyGemsソースからgemを取得したときと同じ方法でテストできます。