問題
サブコマンドのヘルプを見るにはdemo help subcommand
と入力する必要があります。
出来れば demo subcommand -h
と打ちたい所です。
# ok
$ demo help abc
print 'abc'
# error
$ demo abc -h
demo abc requires at least 0 argument:
解法
class_option
の設定とThor::invoke_task
の上書きで実現します。
demo.rb
#! /usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'thor'
class Demo < Thor
class_option :help, :type => :boolean, :aliases => '-h', :desc => 'Help message.'
desc "abc", "print 'abc'"
def abc
puts 'abcdefg!'
end
desc "efg [option]", "print 'efg'"
option :upcase, :type => :boolean, :aliases => '-u', :desc => "disp upcase"
def efg
if options[:upcase]
puts 'EFG!'
else
puts 'efg!'
end
end
no_tasks do
# デフォルトメソッドを上書きして -h を処理
# defined in /lib/thor/invocation.rb
def invoke_task(task, *args)
if options[:help]
Demo.task_help(shell, task.name)
else
super
end
end
end
end
Demo.start
demo subcommand -h
とdemo help subcommand
のどちらでも可能になります。
$ chmod +x demo2
$ demo2 abc -h
print 'abc'
$ demo2 help abc
print 'abc'
実例
Milkodeの次のバージョンに組み込まれます。milkコマンドの内部で利用しました。
tomykairaさんのパッチにより実現されました。