Допустим, у меня есть простое приложение 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».
Возможно, OptionParser — неподходящий инструмент для этой работы. Очевидно, было бы тривиально разделить ARGV самостоятельно. Мне просто интересно, что происходит с этим поведением. Я на Руби 1.9.2.