如何生成OptionParser需要参数

问题描述 投票:0回答:3

下面的代码可以工作,但是当我想将所需参数构建到所需参数的本机 OptionParser 语法中时,我使用

fetch
手动引发所需参数的参数错误:

# ocra script.rb -- --type=value
options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: example.rb [options]"

  opts.on("--type [TYPE]",String, [:gl, :time], "Select Exception file type (gl, time)") do |t|
    options["type"] = t
  end

  opts.on("--company [TYPE]",String, [:jaxon, :doric], "Select Company (jaxon, doric)") do |t|
    options["company"] = t
  end

end.parse!

opts = {}
opts['type'] = options.fetch('type') do
  raise ArgumentError,"no 'type' option specified  as a parameter (gl or time)"
end

opts['company'] = options.fetch('company') do
  raise ArgumentError,"no 'company' option specified  as a parameter (doric or jaxon)"
end
ruby optionparser
3个回答
18
投票

有一个类似的问题,其答案可能对您有帮助: “如何使用 Ruby OptionParser 指定所需的开关(而不是参数)?

简而言之:似乎没有办法使选项成为必需的(毕竟它们被称为选项)。

您可以引发一个

OptionParser::MissingArgument
异常,而不是您当前抛出的
ArgumentError


5
投票

面对同样的情况,我最终做出了这样的选择。如果没有提供我所有的强制选项,则根据我定义的选项输出

OptionParser
生成的用户友好的帮助文本。感觉比抛出异常并向用户打印堆栈跟踪更干净。

options = {}
option_parser = OptionParser.new do |opts|
  opts.banner = "Usage: #{$0} --data-dir DATA_DIR [options]"

  # A non-mandatory option
  opts.on('-p', '--port PORT', Integer, 'Override port number') do |v|
    options[:port] = v
  end

  # My mandatory option
  opts.on('-d', '--data-dir DATA_DIR', '[Mandatory] Specify the path to the data dir.') do |d|
    options[:data_dir] = d
  end
end

option_parser.parse!

if options[:data_dir].nil?
  puts option_parser.help
  exit 1
end

0
投票

我为

options
实现了一种简单的方法,以更易读的方式验证所需的参数。此方法使您能够定义人类可读的错误消息,以提高清晰度。其工作原理如下:

options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: your script [options]"
  opts.on("-n", "--name NAME", "Reporter name. Human-readable name that will be used in a report") do |n|
    options[:name] = n 
  end
  opts.on("-u", "--username USERNAME", "GitHub username. For example, 'volodya-lombrozo'") do |u|
    options[:username] = u
  end
  opts.on("-p", "--position", "Reporter position in a company. Default value is a 'Software Developer'.") do |p|
    options[:position] = p
  end
end.parse!

# Custom method to raise an exception with a human-readable message
def options.require_option(key, message)
  raise OptionParser::MissingArgument, message if self[key].nil?
end

# Check for required options
options.require_option(:name, "Reporter name is required. Please specify using -n or --name.")
options.require_option(:username, "GitHub username is required. Please specify using -u or --username.")

此代码片段通过提供信息丰富的错误消息来增强选项验证的可读性。如果缺少任何必需的选项,它将引发

OptionParser::MissingArgument
异常并显示指定的消息。

© www.soinside.com 2019 - 2024. All rights reserved.