我正在尝试使用OptionParser创建一个带有子命令的命令行程序。我在跟着"用于获取子命令的ruby的OptionParser“。
问题在于它不允许像这样的用例:
ruby main.rb --version
#=> main.rb in `<main>': undefined method `order!' for nil:NilClass (NoMethodError)但它确实允许这样做:
ruby main.rb foo --options
ruby main.rb --options foo
ruby main.rb --options foo --options在没有给出子命令的情况下,如何正确处理命令行参数。
我的示例代码是:
global = OptionParser.new do |opts|
opts.banner = "Usage: opt.rb [options] [subcommand [options]]"
opts.on("-v", "--version", "Print the version") do |v|
options[:version] = v
end
opts.separator ""
opts.separator subtext
end发布于 2015-07-20 19:08:53
带有错误的行:
global.order!
command = ARGV.shift
subcommands[command].order!如果global.order!使用所有的ARGV,那么命令就是nil。所以..。去查一下。
global.order!
command = ARGV.shift
unless command
STDERR.puts "ERROR: no subcommand"
STDERR.puts global # prints usage
exit(-1)
end
subcommands[command].order!发布于 2015-07-20 18:50:36
也许这会有帮助:
require 'optparse'
VERSION = '1.0.0'
options = {}
OptionParser.new do |opt|
opt.on('-f', '--foo', 'Foo it') { |o| options[:foo] = o }
opt.on_tail('-v', '--version') do
puts VERSION
exit
end
end.parse!
puts options将其保存为"test.rb“,并使用ruby test.rb返回运行它:
{}使用ruby test.rb -f或--foo运行它将返回:
{:foo=>true}使用ruby test.rb -v或--version运行它将返回:
1.0.0为了获得更多乐趣,运行ruby test.rb -h或--help返回:
Usage: test [options]
-f, --foo Foo it尽管我没有定义-h或--help。
如果我希望-v和--version标志出现在列表中,那么我会将它们从on_tail方法更改为普通的on方法:
require 'optparse'
VERSION = '1.0.0'
options = {}
OptionParser.new do |opt|
opt.on('-f', '--foo', 'Foo it') { |o| options[:foo] = o }
opt.on('-v', '--version', 'Returns the version') do
puts VERSION
exit
end
end.parse!
puts options它将返回:
Usage: test [options]
-f, --foo Foo it
-v, --version Returns the version我可以补充如下:
puts ARGV到脚本的末尾,并确保OptionParser正确地处理标志和参数:
>ruby test.rb bar --foo
{:foo=>true}
bar
>ruby test.rb --foo bar
{:foo=>true}
bar有关更多信息,请参见"通过命令行将变量传递给Ruby脚本“。
示例代码不可能使用--options处理示例输入。没有为--options定义处理程序。subtext也不是。您的代码返回:
undefined local variable or method `subtext' for main:Object (NameError)将街区剥离至:
global = OptionParser.new do |opts|
opts.on("-v", "--version", "Print the version") do |v|
options[:version] = v
end
end并再次运行返回:
invalid option: --options (OptionParser::InvalidOption)所以,同样,你的例子与你说的结果不一致。
https://stackoverflow.com/questions/31522912
复制相似问题