Подтвердить что ты не робот

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

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

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

$ ruby someRubyScript.rb -a argumentA -b argumentB

Любые мысли?

4b9b3361

Ответ 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