簡體   English   中英

使用ruby的OptionParser來解析子命令

[英]Using ruby's OptionParser to parse sub-commands

我希望能夠使用ruby的OptionParser來解析表單的子命令

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

喜歡:

git branch -a
gem list foo

我知道我可以切換到一個不同的選項解析器庫(如Trollop),但我有興趣從OptionParser中學習如何做到這一點,因為我想更好地學習庫。

有小費嗎?

弄清楚了。 我需要使用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!

看起來OptionParser語法已經改變了一些。 我不得不使用以下內容,以便arguments數組具有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

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/找到該教程。

還有其他你可以看到的寶石,如main

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM