Мога ли да използвам OptionParser на Ruby, за да приема произволен модел на аргумент?

Да кажем, че имам просто приложение 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 сам. Просто се чудя какво се случва с това поведение. Аз съм на Ruby 1.9.2.


person Trevor Burnham    schedule 19.07.2010    source източник


Отговори (2)


При условие, че използвате метода 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

person Chris    schedule 29.10.2012

Бих казал, че трябва да анализирате аргументи като този от ARGV, преди да стартирате OptionParser

e.g.

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

P.S. Бих препоръчал Trollop. Намирам го за много по-просто и е добре да изберете настройки по подразбиране.

person Blaine Lafreniere    schedule 19.07.2010