MixにTaskを追加する
ElixirにおけるMixは、Rubyで言うとRakeポジションにあたるモノ。 当然タスクを自作できるはず。
まずmix new hoge
して、ディレクトリ掘削作業。
$ mkdir -p lib/mix/tasks/hoge
hoge
ってのはプロジェクト名と揃えておいたけど、fuga
でもOK。いっぱい作ってもOK。
いざタスク作成。
# lib/mix/tasks/hoge/say.ex defmodule Mix.Tasks.Hoge.Say do use Mix.Task def run(args) do Enum.each args, fn(arg) -> IO.puts IO.ANSI.bright <> IO.ANSI.green <> (inspect arg) <> IO.ANSI.reset end end end
ポイントは
- モジュール名でタスク名が決まる。
- ファイル名は何でもいいけど、メリット無いから揃えるべき。
use Mix.Task
必須。run/1
を定義。- タスクの本体。
- 引数には、コマンドラインで書かれたものが文字列リストで渡ってくる。
mix compile
して実行すると
$ mix hoge.say making good things better "making" "good" "things" "better"
色は違うけどこんな感じ。
ただし、このままだとmix help
に自作タスクが表示されなくて悲しみがとまらない。
原因はタスクの説明が無いことです。
# lib/mix/tasks/hoge/say.ex defmodule Mix.Tasks.Hoge.Say do @shortdoc "緑色に光る" # 追加 # (中略) end
以上。
追記
MLで聞いてみたところ、@shortdoc
の無いタスクはプライベート的タスクであることを意味しているそうで、直接実行してほしくないものだそうです。
自作タスクには忘れずに@shortdoc
を書きましょう。