下面的代码可以工作,但是当我想将所需参数构建到所需参数的本机 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 指定所需的开关(而不是参数)?”
简而言之:似乎没有办法使选项成为必需的(毕竟它们被称为选项)。
您可以引发一个
OptionParser::MissingArgument
异常,而不是您当前抛出的 ArgumentError
。
面对同样的情况,我最终做出了这样的选择。如果没有提供我所有的强制选项,则根据我定义的选项输出
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
我为
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
异常并显示指定的消息。