どういうはなし?
Ruby でコマンドラインツールを作る方法はいくつもある。
まず Rake。
Rakefile という名前のファイルにタスクを書いておけば,
rake hoge
のように,rake
に続けてタスク名を書くことで実行できる。
しかし,タスクにパラメーターを渡すやり方が,環境変数を介す
rake hoge name=foo
といったもので,やや冗長。
また,タスクやパラメーターの与え方を表示するヘルプを自前で書かないといけないのが面倒。
Thor はこれらの問題を解決する。
しかし,Thor だと
thor fuga:hoge
のように,コマンド名が fuga:hoge
のような形になってしまう。
つまり,fuga
というコマンドの hoge
というサブコマンド,という形で動かすことになっている。
なんとか
thor hoge
だけの形で使いたいのだが,というのがこの記事の主旨。
Thor おさらい
Thor をいちおう知っている,という前提で書くので,ご存知なければ例えば以下の記事を参照されたい。
Thor の使い方は大雑把に二種類あるが,この記事では
class Fuga < Thor
desc "hoge", "Hogehoge"
def hoge
end
end
と書いて,
thor fuga:hoge
と書くやり方を前提にする。
なお,ファイル名は拡張子が .thor
なら何でもいい。
コマンドを単に hoge と書きたい
上記のように,Fuga
クラスに hoge
メソッドを定義すると,fuga:hoge
という Thor コマンドができる。
しかし,単に
thor hoge
という形で使いたいんだよなあ。
Thor の解説記事や本家サイトなどを見ても,なかなかこの方法が見当たらない。
default_command
というやり方もあるんだけど,これは fuga:hoge
の :hoge
が略せるというもので,ちょっと違う。
コマンド一覧を
thor list
で表示したときも
fuga
----
thor fuga:hoge # Hogehoge
となる。あくまで fuga
の hoge
ということ。
hoge
コマンドの説明を見ようとして,
thor help hoge
としても,「そんなコマンドは知らん」と言われてしまう。
解決:Default という特別なクラス
いろいろ探っているうちに,いちおうやり方が分かった。
クラス名を以下のように Default
にすればよいようだ。このクラス名は特別であるらしい。
class Default < Thor
desc "hoge", "Hogehoge"
def hoge
puts "hoge"
end
end
これだと
thor hoge
の形で使えるし,
thor help hoge
で説明を見ることもできる。
ただ,コマンド一覧を
thor list
で表示すると
default
-------
thor :hoge # Hogehoge
という表示になる。
惜しい。:
は表示してくれなくていいのに。
いやもちろん
thor :hoge
とコロン付きで打っても期待どおりに動くのだけれど,わざわざそんな打ち方しないので,コロン抜きで表示してほしかった。
(自分が使うぶんには気にしないのだが,他人に使ってもらうコマンドラインツールだと,いちいち説明しないといけないのが面倒くさい)