Именованные аргументы командной строки в Ruby
Есть ли способ передать именованные аргументы Ruby script?
Я понимаю метод ARGV для передачи параметров, но для этого требуется, чтобы они находились в определенном порядке. То, что я хотел бы сделать, это передать именованные аргументы, похожие на другие операции с командной строкой. Например:
$ ruby someRubyScript.rb -a argumentA -b argumentB
Любые мысли?
Ответы
Ответ 1
Есть несколько вариантов.
-
OptionParser, в стандартной библиотеке, является одним из самых популярных. Он может делать именно то, что вы хотите, и API хорош.
-
GetOptLong также входит в стандартную библиотеку, и он обновляет командные строки стиля POSIX. Если вы хотите эмулировать приложение командной строки Unix, это может сделать все.
-
Ara T. Howard Main - отличный камень для создания сценариев командной строки. Он выходит за рамки анализа аргументов и создает автоматическое использование и подсказки с подсказками, все с красивым DSL для указания параметров командной строки.
Обновление 2014
Несколько новых драгоценных камней выросли до популярности:
-
Slop предоставляет фантастически простой API, который сводит к минимуму количество кода, которое вы должны были бы написать с помощью OptionParser.
-
Highline не является технически парсером аргументов командной строки, а вместо этого позволяет запрашивать данные для пользователей, в том числе с проверками, Это можно объединить с одним из вышеперечисленных, чтобы обеспечить полный интерактивный CLI.
Ответ 2
Вы можете использовать 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
Ответ 3
Стандартная библиотека Ruby поставляется с GetOptLong, которая должна делать то, что вы хотите.
GetoptLong позволяет использовать параметры в стиле POSIX, такие как -file, а также варианты с одной буквой, такие как -f
Ответ 4
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}
Ответ 5
Для серьезного приложения CLI вы можете использовать gem thor, доступный в https://github.com/wycats/thor
Ответ 6
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