概要
railsでコマンドラインスクリプトを各方法はtaskとrunnerと2種類あります。
taskは引数の扱いが微妙で、オプションも扱えません。書き方も独特なためイマイチ好きになれません。またspringも効かないので読み込みも遅いです。
runnerはspringが効くので起動は早めですが引数を自分で解析しないといけません。
Thorというrubyのコマンドライン用のツールがあって引数やオプションを柔軟に扱えて便利です。以前「Thorのコマンドの中でrailsのActiveRecordを使う」という記事を書きましたが、spring経由で起動できないので起動が遅くイマイチでした。
実はその記事を書いた時点でrunnerの存在をすっかり忘れてました。runner経由で起動し、Thorで引数の解析を出来ないか試したらあっさり動きました。
コード
スクリプトを置く場所はどこでもOKですが、thor/test
にスクリプトをおいた前提で書きます。
# thor/test
class Main < Thor
desc "exec", "foobar"
def exec(foobar)
# ここで何かする
end
end
Main.start(ARGV)
まあ、普通のThorのスクリプトですね。これをrunner経由で呼び出します。
$ bin/rails runner thor/test exec foobar
Running via Spring preloader in process 66365
こんな感じで実行します。ちなみにthor/test
内のARGV
には[exec foobar]
が来ます。なのでThorがうまく引数やオプションを解析できるんですね。
既存のツール、機能の組み合わせですが、すっかり見落としてました。Railsのコマンドライン関係がイマイチだと思ってたのですが、私の中ではこれで決まりといった感じです。