OptionParser with subcommands

12 浏览
0 Comments

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

0
0 Comments

问题出现的原因是当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的情况,并确保程序正常执行。

0
0 Comments

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变量的问题。然而,原始代码中并没有定义这些选项和变量,因此会导致错误。

0