![](/img/trans.png)
[英]Where is the documentation for Ruby OptionParser's parse! method?
[英]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.