Именованные аргументы командной строки в Ruby - PullRequest
15 голосов
/ 15 декабря 2010

Есть ли способ передать именованные аргументы в скрипт Ruby?

Я понимаю метод передачи параметров в ARGV, но для этого требуется, чтобы они были в определенном порядке.Я хотел бы передать именованные аргументы, похожие на другие операции командной строки.Например:

$ ruby someRubyScript.rb -a argumentA -b argumentB

Есть мысли?

Ответы [ 6 ]

21 голосов
/ 15 декабря 2010

Есть несколько вариантов.

  • OptionParser в стандартной библиотеке является одним из самых популярных. Он может делать именно то, что вы хотите, и API это хорошо.

  • GetOptLong также находится в стандартной библиотеке и переопределяет командные строки в стиле POSIX. Если вы хотите эмулировать приложение командной строки Unix, это может сделать все.

  • Ара Т. Говарда Main - это замечательная жемчужина для создания сценариев командной строки. Он выходит за рамки синтаксического анализа аргументов и создает автоматические приглашения на использование и подсказки, все с хорошим DSL для указания параметров командной строки.

2014 Обновление

Пара новых драгоценных камней выросла до популярности:

  • Slop предоставляет фантастически простой API, который сводит к минимуму объем кода, который вам придется писать с помощью OptionParser.

  • Highline технически не является синтаксическим анализатором аргументов командной строки, но вместо этого представляет собой способ запрашивать у пользователей данные с проверками. Это может быть объединено с одним из вышеперечисленных для обеспечения полного интерактивного интерфейса командной строки.

5 голосов
/ 15 декабря 2010

Вы можете использовать OptionParser для простого анализа некоторых аргументов.

require 'optparse'

hash_options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: your_app [options]"
  opts.on('-a [ARG]', '--argument_a [ARG]', "Specify the argument_a") do |v|
    hash_options[:argument_a] = v
  end
  opts.on('-b [ARG]', '--argument_b [ARG]', "Specify the argument_b") do |v|
    hash_options[:argument_b] = v
  end
  opts.on('--version', 'Display the version') do 
    puts "VERSION"
    exit
  end
  opts.on('-h', '--help', 'Display this help') do 
    puts opts
    exit
  end
end.parse!

Тогда ваше приложение нужно будет запустить как:

ruby application -a=12 -b=42 or
ruby application --argument_a=12 --argument_b=42

Вот документация:

http://www.ensta.fr/~diam/ruby/online/ruby-doc-stdlib/libdoc/optparse/rdoc/classes/OptionParser.html

2 голосов
/ 15 декабря 2010

Trollop пока не упоминается: рекомендуемый, декларативный и компактный. Хотя его, очевидно, можно использовать в качестве драгоценного камня, вы всегда можете скопировать его в свой проект, поскольку это (относительно небольшой) отдельный файл.

require 'trollop'
opts = Trollop::options do
  opt :monkey, "Use monkey mode"                     # flag --monkey, default false
  opt :goat, "Use goat mode", :default => true       # flag --goat, default true
  opt :num_limbs, "Number of limbs", :default => 4   # integer --num-limbs <i>, default to 4
  opt :num_thumbs, "Number of thumbs", :type => :int # integer --num-thumbs <i>, default nil
end
#=> {:monkey => false, :goat => true, :num_limbs => 4, :num_thumbs => nil}
2 голосов
/ 15 декабря 2010

Стандартная библиотека Ruby поставляется с GetOptLong , который должен делать то, что вы хотите.

GetoptLong допускает параметры в стиле POSIX, такие как —file, а также параметры, состоящие из одной буквы, например -f

1 голос
/ 18 марта 2012

Для серьезных приложений CLI вы можете использовать драгоценный камень, доступный по адресу https://github.com/wycats/thor

0 голосов
/ 15 сентября 2014

EasyOptions не требует анализа кода:

## Usage: program [options]
##   --verbose, -v   Verbose mode
##   --logfile=NAME  Log filename

require 'easyoptions'

if EasyOptions.options[:verbose]
    puts EasyOptions.options[:logfile]
    puts EasyOptions.arguments[0]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...