Могу ли я использовать OptionParser Руби для принятия произвольного шаблона аргумента? - PullRequest
2 голосов
/ 19 июля 2010

Допустим, у меня есть простое приложение на Ruby, в котором я хочу, чтобы первый аргумент (если есть) определял среду: TEST, DEVELOPMENT или PRODUCTIONDEVELOPMENT по умолчанию, если аргумент отсутствует дано). Например,

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.

Ответы [ 2 ]

1 голос
/ 29 октября 2012

Если вы используете метод 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

0 голосов
/ 19 июля 2010

Я бы сказал, что перед запуском OptionParser

нужно разобрать подобные аргументы из ARGV.

, например

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

P.S. Я бы порекомендовал Trollop. Я нахожу это намного проще, и это хорошо, когда выбираешь значения по умолчанию.

...