mmag

ハマったことメモなど

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を書きましょう。