29

我希望能够使用 ruby​​ 的 OptionParser 来解析表单的子命令

COMMAND [GLOBAL FLAGS] [SUB-COMMAND [SUB-COMMAND FLAGS]]

喜欢:

git branch -a
gem list foo

我知道我可以切换到不同的选项解析器库(如 Trollop),但我有兴趣从 OptionParser 中学习如何做到这一点,因为我想更好地学习这个库。

有小费吗?

4

4 回答 4

45

弄清楚了。我需要使用OptionParser#order!. 它将从头开始解析所有选项,ARGV直到找到非选项(不是选项参数),从 中删除它处理的所有内容ARGV,然后退出。

所以我只需要做类似的事情:

global = OptionParser.new do |opts|
  # ...
end
subcommands = { 
  'foo' => OptionParser.new do |opts|
     # ...
   end,
   # ...
   'baz' => OptionParser.new do |opts|
     # ...
   end
 }

 global.order!
 subcommands[ARGV.shift].order!
于 2010-04-29T13:49:38.503 回答
1

看起来 OptionParser 语法已经改变了一些。我必须使用以下内容,以便参数数组具有 opts 对象未解析的所有选项。

begin
  opts.order!(arguments)
rescue OptionParser::InvalidOption => io
  # Prepend the invalid option onto the arguments array
  arguments = io.recover(arguments)
rescue => e
  raise "Argument parsing failed: #{e.to_s()}"
end
于 2011-04-28T15:51:01.560 回答
0

您还可以查看其他宝石,例如main

于 2010-04-29T14:04:44.417 回答
0

GLI 是要走的路,https://github.com/davetron5000/gli。教程的摘录:

#!/usr/bin/env ruby
require 'gli'
require 'hacer'

include GLI::App

program_desc 'A simple todo list'

flag [:t,:tasklist], :default_value => File.join(ENV['HOME'],'.todolist')

pre do |global_options,command,options,args|
  $todo_list = Hacer::Todolist.new(global_options[:tasklist])
end

command :add do |c|
  c.action do |global_options,options,args|
    $todo_list.create(args)
  end
end

command :list do |c|
  c.action do
    $todo_list.list.each do |todo|
      printf("%5d - %s\n",todo.todo_id,todo.text)
    end
  end
end

command :done do |c|
  c.action do |global_options,options,args|
    id = args.shift.to_i
    $todo_list.list.each do |todo|
      $todo_list.complete(todo) if todo.todo_id == id
    end
  end
end

exit run(ARGV)

您可以在http://davetron5000.github.io/gli/找到教程。

于 2013-07-14T21:25:56.150 回答