2

假设我有一个简单的 Ruby 应用程序,我希望第一个参数(如果有)指定环境:TESTDEVELOPMENTPRODUCTION如果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'则不会。)而且我无法看到让 OptionParser 查找以 't' 开头的字符串,而不是确切的字符串 'test'。

也许 OptionParser 是不适合这项工作的工具。显然,自己拆分 ARGV 是微不足道的。我只是想知道这种行为是怎么回事。我在 Ruby 1.9.2 上。

4

2 回答 2

1

如果您使用该parse!方法,调用处理的任何参数都会从数组中破坏性opts.on地剥离。这意味着数组的原始内容将不再包含方法之后的那些标志。ARGVARGVparse!

我建议通过将 ARGV 与包含“测试”和“生产”的数组进行比较来手动解析剩余的参数集。

查看文档: 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 回答