LoginSignup
0
1

More than 3 years have passed since last update.

thor hoge と書きたい

Last updated at Posted at 2019-05-14

どういうはなし?

Ruby でコマンドラインツールを作る方法はいくつもある。

まず Rake。
Rakefile という名前のファイルにタスクを書いておけば,

rake hoge

のように,rakeに続けてタスク名を書くことで実行できる。

しかし,タスクにパラメーターを渡すやり方が,環境変数を介す

rake hoge name=foo

といったもので,やや冗長。
また,タスクやパラメーターの与え方を表示するヘルプを自前で書かないといけないのが面倒。

Thor はこれらの問題を解決する。

しかし,Thor だと

thor fuga:hoge

のように,コマンド名が fuga:hoge のような形になってしまう。
つまり,fuga というコマンドの hoge というサブコマンド,という形で動かすことになっている。
なんとか

thor hoge

だけの形で使いたいのだが,というのがこの記事の主旨。

Thor おさらい

Thor をいちおう知っている,という前提で書くので,ご存知なければ例えば以下の記事を参照されたい。

Thor の使い方は大雑把に二種類あるが,この記事では

honyarara.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

となる。あくまで fugahoge ということ。
hoge コマンドの説明を見ようとして,

thor help hoge

としても,「そんなコマンドは知らん」と言われてしまう。

解決:Default という特別なクラス

いろいろ探っているうちに,いちおうやり方が分かった。
クラス名を以下のように Default にすればよいようだ。このクラス名は特別であるらしい。

honyarara.thor
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

とコロン付きで打っても期待どおりに動くのだけれど,わざわざそんな打ち方しないので,コロン抜きで表示してほしかった。
(自分が使うぶんには気にしないのだが,他人に使ってもらうコマンドラインツールだと,いちいち説明しないといけないのが面倒くさい)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1