У меня есть решение. Вместо использования Thor :: Group я использую Invocations
bin / foo выглядит так:
#!/usr/bin/env ruby
require 'foo'
Foo::CLI.start
lib / cli.rb - регистрирует 'generate' как подзадачу базовой команды, foo:
module Foo
class CLI < Thor
register(Generate, 'generate', 'generate [something]', 'Type foo generate for more help.')
end
end
lib / generate.rb выглядит так:
module Foo
class Generate < Thor
desc "project [name]", "Prints the project making step"
def project(name)
puts "making first project file #{name}"
invoke :config
invoke :project_sub
end
desc "config [name]", "Prints the config making step"
def config(name)
puts "making first config file #{name}"
invoke :project_sub
end
desc "project_sub [name]", "Prints the project_sub making step"
def project_sub(name)
puts "making subsystem file #{name}"
end
def self.banner(task, namespace = false, subcommand = true)
task.formatted_usage(self, true, subcommand).split(':').join(' ')
end
end
end
Теперь я могу напечатать: foo generate project fred
и он выдаст:
> making first project file fred
> making first config file fred
> making subsystem file fred
Обратите внимание на переопределение баннера. Это означает, что ввод: foo generate project
с недействительными или отсутствующими аргументами даст правильное сообщение справки:
"project" was called incorrectly. Call as "foo generate project [name]".
в отличие от
"project" was called incorrectly. Call as "foo project [name]".