Именованные аргументы командной строки в Ruby

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

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

$ ruby someRubyScript.rb -a argumentA -b argumentB

Любые мысли?

6 ответов

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

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

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

  • Ara T. Howard Main - отличный камень для создания сценариев командной строки. Он выходит за рамки анализа аргументов и создает автоматическое использование и подсказки с подсказками, все с красивым DSL для указания параметров командной строки.

Обновление 2014

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

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

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


Вы можете использовать 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


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

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


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}
</i></i>


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


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

licensed under cc by-sa 3.0 with attribution.