0

コマンド ライン アプリを構築するための優れたフレームワークであるmetadoneを使用して、空のプロジェクトを開始しました。App唯一の問題は、あるクラス内からデバッグできないことですbin/my_app

クラスは、Appメタドンを実行したときに作成されるファイルです。これが私がpryを使用しようとしている方法です

#!/usr/bin/env ruby

require 'optparse'
require 'methadone'
require 'my_app'
require 'pry'

class App
  include Methadone::Main
  include Methadone::CLILogging

  main do
     binding.pry    #  <= pry here
  end

  ...

実行rake featuresすると、実行中のプロセスが数秒間一時停止するため、実行中のプロセスが pry で何かをしようとしていることがわかります。次のエラーが発生し、rake/cucumber が中止されます。

process still alive after 3 seconds (ChildProcess::TimeoutError)

pry は、キュウリの手順、rspec、またはその他の場所から問題なく使用できますが、このAppクラスのどこからでも使用することはできません。

非常に興味深いことの 1 つは、コマンド ライン アプリをコンソールから実行すると、pry の場所で停止することです。キュウリを使用しても、こじ開けることはありません。

実行中にアプリを pry で動作させるにはどうすればよいですrake featuresか?

アップデート

申し訳ありませんが、メタドンがアルバに付属していることを明確にする必要があります. したがって、私のキュウリのシナリオは次のようになります

When I successfully run `my_app arg1`

しかし、私がそれを実行すると、デバッグ/プライに入るでしょう

bundle exec bin/my_app
4

2 に答える 2

1

pry -remoteを使用して、Aruba が管理するサブプロセスの pry セッションに接続します。

(開示: @Dty と組み合わせてこのソリューションにたどり着きました)

于 2012-10-05T02:37:10.613 に答える
1

Aruba はアプリをまったく別のプロセスで実行するため、aruba がアプリを実行すると、プロンプトで pry が起動し、入力を待機することが起こっていると思います。何も取得されないため、aruba は 3 秒後にタイムアウトします (デフォルトでは、アプリが完了するまで待機します)。これが、「プロセスがまだ生きている」問題が発生する理由です。

アプリの標準入力に接続するために実行中のシェルの標準入力を取得して、rake featuresこじ開けコマンドを発行できるようにする方法は 100% わかりませんが、aruba がこれを許可するように設計されているとは思いません。

いくつかのオプションがあります。

  • @announce でシナリオにタグを付け、When I run interactively...その後にいくつかのコマンドを使用します。When I typeこれらのコマンドは、待機中のインタラクティブな pry コンソールに移動する必要があります。ちょっと不器用ですが、うまくいくかもしれません
  • クラスの単体テストを実行しますApp。テストで実行可能ファイルを直接操作できるように、への呼び出しをgo!次のようなものに置き換える必要があります。go! if $0 == __FILE__requireApp

私はこれらのいずれも試していませんが、2 番目のオプションは少し気分が良く、これを行う良い方法を見つけられれば、ライブラリからのサポートによって改善される可能性もあります。

于 2012-09-10T02:27:07.603 に答える