Как использовать разные опции для каждого позиционного аргумента с OptionParser
Я хочу сделать скрипт, вызываемый с этим синтаксисом:
script.rb [common-options] arg1 [arg1-options] [arg2 [arg2-options] …]
Например:
script.rb --verbose --dry-run a1 --outfile c1 a2 --reprocess --outfile c2 a3 a4 --outfile b42
Возвращая что-то вроде этого в мой код:
options = {verbose: true, :'dry-run' => true}
args = {
'a1' => {outfile: 'c1'},
'a2' => {outfile: 'c2', reprocess: true},
'a3' => {},
'a4' => {outfile: 'b42'},
}
Я не могу понять из документации OptionParser, возможно ли это вообще.
Кто-нибудь знает решение для этого?
1 ответ
Наконец-то нашел решение в " Использование OptionParser в ruby для разбора подкоманд ".
Мне нужно использовать плохо документированные order
метод, который будет анализировать параметры только до первого позиционного аргумента. parse
разберу весь ARGV:
require 'optparse'
options = {}
filenames = []
file_options = Hash.new do |hash, key| hash[key] = {} end
filename = nil
file_parser = OptionParser.new do |o|
o.banner = 'Options for every file (goes after every filename):'
o.on '-o', '--outfile=FILE', 'A file to write result to' do |arg|
file_options[filename][:outfile] = arg
end
end
global_parser = OptionParser.new do |o|
o.banner = [
"Super duper file processor.\n",
"Usage: #{$PROGRAM_NAME} [options] file1 [file1-options] [file2 [file2-options] …]",
].join("\n")
o.separator ''
o.separator 'Common options:'
o.on '-v', '--verbose', 'Display result filenames' do |arg|
options[:verbose] = arg
end
o.on '-h', '--help', 'Print this help and exit' do
$stderr.puts opts
exit
end
o.separator ''
o.separator file_parser.help
end
begin
argv = global_parser.order(ARGV)
while (filename = argv.shift)
filenames.push(filename)
file_parser.order!(argv)
end
rescue OptionParser::MissingArgument => e
$stderr.puts e.message
$stderr.puts global_parser
exit 1
end
if filenames.empty?
$stderr.puts global_parser
exit 1
end
Если я выполню свой скрипт так:
script.rb -v a -o a.out b c d -o d.out
Я получу:
options = {:verbose=>true}
file_options = {"a"=>{:outfile=>"a.out"}, "d"=>{:outfile=>"d.out"}}
И этот текст справки будет сгенерирован:
Super duper file processor.
Usage: script.rb [options] file1 [file1-options] [file [file2-options]…]
Common options:
-v, --verbose Display converted filenames
-h, --help Print this help and exit
Options for every file (goes after every filename):
-o, --outfile=FILE A file to write result to