Разобрался. Мне нужно использовать 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!