我可以使用Ruby的OptionParser接受任意参数模式吗?

时间:2010-07-19 17:13:18

标签: ruby command-line-arguments optionparser

假设我有一个简单的Ruby应用程序,我想要第一个参数(如果有的话)来指定环境:TESTDEVELOPMENTPRODUCTIONDEVELOPMENT如果没有给出参数,则为默认值)。例如,

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'。 / p>

也许OptionParser是错误的工具。显然,自己拆分ARGV是微不足道的。我只是想知道这种行为发生了什么。我在Ruby 1.9.2上。

2 个答案:

答案 0 :(得分:1)

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

我建议通过将ARGV与包含'test'和'production'的数组进行比较来手动解析剩余的参数集。

查看文档: http://ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html#method-i-parse-21

答案 1 :(得分:0)

我说你需要在运行OptionParser之前解析ARGV之类的论点

e.g。

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

P.S。我推荐Trollop。我觉得它更简单,选择默认值也很好。