OptionParser with subcommands
OptionParser with subcommands
我正在尝试使用OptionParser创建一个带有子命令的命令行程序。我正在遵循"ruby的OptionParser获取子命令"。
问题是它不允许这样的用例:
ruby main.rb --version #=> main.rb in `': 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", "打印版本号") do |v| options[:version] = v end opts.separator "" opts.separator subtext end
问题出现的原因是当global.order!
使用了所有的ARGV
后,command
变量变为了nil
。因此,需要检查command
是否为nil
。
解决方法是在global.order!
之后使用ARGV.shift
将下一个参数赋值给command
变量。然后,使用unless command
判断command
是否为nil
。如果是,则输出错误信息并退出程序。如果不是,则继续执行下面的代码subcommands[command].order!
。
以下是整理后的文章:
OptionParser with subcommands
问题的出现原因及解决方法
在使用OptionParser
的子命令时,可能会遇到一个问题。具体表现在以下代码中:
global.order! command = ARGV.shift subcommands[command].order!
如果global.order!
使用了所有的ARGV
,那么command
变量将变为nil
。因此,需要检查command
是否为nil
。
解决方法是在global.order!
之后使用ARGV.shift
将下一个参数赋值给command
变量。然后,使用unless command
判断command
是否为nil
。如果是,则输出错误信息并退出程序。如果不是,则继续执行下面的代码subcommands[command].order!
。
以下是解决方法的代码示例:
global.order! command = ARGV.shift unless command STDERR.puts "ERROR: no subcommand" STDERR.puts global # prints usage exit(-1) end subcommands[command].order!
通过以上解决方法,可以避免OptionParser with subcommands
问题中command
变量为nil
的情况,并确保程序正常执行。
OptionParser是一个用于解析命令行选项的Ruby库。在上面的代码示例中,使用OptionParser创建了一个命令行解析器,并定义了三个选项:-f,--foo和-v,--version。
在代码的末尾,使用.parse!方法解析命令行参数,并将解析结果存储在options哈希中。如果不指定任何选项,则options哈希为空。如果使用-f或--foo选项,则options哈希将包含{:foo=>true}。如果使用-v或--version选项,则程序将打印版本号并退出。
如果使用-h或--help选项,则程序将打印帮助信息,该信息由OptionParser自动生成。
原问题的出现是因为原始代码中的选项-v和--version被定义为on_tail方法,而不是普通的on方法。这导致它们在帮助信息中没有显示出来。解决方法是将这两个选项改为on方法。
另外,原问题中引用了另一个相关的问题,该问题涉及到处理--options选项和subtext变量的问题。然而,原始代码中并没有定义这些选项和变量,因此会导致错误。