ヽ(´・肉・`)ノログ

How do we fighting without fighting?

Elixirでコマンドラインツールを作る

今日は How to create a command line utility with Elixir and mix というサイトを参考にして Elixirでコマンドラインツールを作ってみる.

まずプロジェクトを作成する.

/Users/niku/projects% elixir -v
Elixir 0.14.3
/Users/niku/projects% mix new timer

何もない状態でビルドしてみる.以前は mix escriptize という名前だったのだけど,v0.14.3になる前に変更されたようだ.

/Users/niku/projects% cd timer
/Users/niku/projects/timer% mix escript.build
Compiled lib/timer.ex
Generated timer.app
** (Mix) Could not generate escript, please set :main_module in your project configuration (under `:escript` option) to a module that implements main/1

うむ. escript の中に main_module を指定してねと書いてある.これも以前は escript_main_module という名前だったのだけど,v0.14.3になる前に変更されたようだ.

そこで mix.exs に足してやる.

# in mix.exs
  def project do
    [app: :timer,
     version: "0.0.1",
     elixir: "~> 0.14.3",
     escript: [ main_module: Timer ], # add here
     deps: deps]
  end

もういちどビルドしてみる.

/Users/niku/projects/timer% mix escript.build
Compiled lib/timer.ex
Generated timer.app
Generated escript timer

通ったみたい. timer というファイルができているので実行してみる.

/Users/niku/projects/timer% ./timer
** (UndefinedFunctionError) undefined function: Timer.main/1
    (timer) Timer.main([])
    (elixir) lib/kernel/cli.ex:70: anonymous fn/3 in Kernel.CLI.exec_fun/2

Timer.main(引数1) が定義されていないとのこと.はい.定義します.

lib/timer.ex に足す.

# in lib/timer.ex
defmodule Timer do
  def main(args) do
    IO.puts("Hello world!")
  end
end

再コンパイル,再実行してみる.

/Users/niku/projects/timer% mix escript.build
Compiled lib/timer.ex
Generated timer.app
Generated escript timer
/Users/niku/projects/timer% ./timer
Hello world!

おっ,よしよし.Hello worldが表示された.

ひとまずここまで.

このエントリーをはてなブックマークに追加