2

最初の引数 (ある場合) で環境を指定する単純な Ruby アプリがあるとします:TESTまたはDEVELOPMENT(PRODUCTION引数DEVELOPMENTが指定されていない場合はデフォルト)。例えば、

ruby myapp.rb test

モードで実行しTESTます。また、略記を受け入れる必要があるため、たとえば

ruby myapp.rb t

TESTモードでアプリを実行し、

ruby myapp.rb dev

モードで実行しDEVELOPMENTます。

OptionParserを使用したいのですが、非常に奇妙な動作をします。myapp.rb が

require 'optparse'

environment = 'DEVELOPMENT'
opts = OptionParser.new
opts.on('test')        { environment = 'TEST' }
opts.on('production')  { environment = 'PRODUCTION' }
opts.parse!(ARGV)

環境はPRODUCTION、私がどんな引数を渡しても変わりません。何らかの理由で、opts.on('production')常にそのブロックを実行します。(代わりにフラグ スタイルの文字列を使用する場合はそうではありません'-production'。) また、正確な文字列 'test' ではなく、't' で始まる文字列を OptionParser に検索させる方法はありません。

おそらく、OptionParser はその仕事に適したツールではありません。明らかに、ARGV を自分で分割するのは簡単なことです。私は、この行動で何が起こっているのか疑問に思っています。私はRuby 1.9.2を使用しています。

4

2 に答える 2

1

このメソッドを使用する場合、呼び出しparse!によって処理される引数はすべて、破壊的に配列opts.onから削除されます。これは、配列の元の内容に、メソッドの後にこれらのフラグが含まれなくなることを意味します。ARGVARGVparse!

ARGVを「test」と「production」を含む配列と比較して、残りの引数のセットを手動で解析することをお勧めします。

ドキュメントを確認してください:http: //ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html#method-i-parse-21

于 2012-10-29T17:22:20.980 に答える
0

OptionParser を実行する前に、ARGV からそのような引数を解析する必要があると思います

例えば

env = ARGV.select{|arg| arg =~ /dev/test/prod/i}.first

PS私はTrollopをお勧めします。私はそれがずっと簡単だと思います、そしてデフォルトを選ぶのは良いことです。

于 2010-07-19T17:26:12.467 に答える