假设我有一个简单的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'
的标志式字符串,则不会这样做。)而且我无法看到OptionParser查找以't'开头的字符串而不是完整的字符串'test'。 / p>
也许OptionParser是错误的工具。显然,自己拆分ARGV是微不足道的。我只是想知道这种行为发生了什么。我在Ruby 1.9.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。我觉得它更简单,选择默认值也很好。