LoginSignup
10

More than 5 years have passed since last update.

Elixir: コマンドラインツールを作成する

Last updated at Posted at 2016-04-18

手順

  1. プロジェクトを作成する
  2. エントリポイントとなるモジュールを作成する
  3. mix.exsを編集する
  4. ビルドを実行する
  5. 動作確認をする

プロジェクトを作成する

  > mix new my_cli

エントリポイントとなるモジュールを作成する

エントリポイントとなるモジュールは, main/1という関数を含んでいること以外に
特に制約はないようです.
今回は, ネタ元にしたがって, lib/my_cli/cli.exに作ることにします.

lib/my_cli/cli.ex
defmodule MyCli.CLI do

  @moduledoc """
  this is my command line tool module
  """

  def main(argv) do
    IO.puts "this is my command line tool"
    IO.inspect argv
  end

end

mix.exsを編集する

mix.exsを編集し, escriptから先ほど作成したモジュールが呼び出されるように設定します.
escriptはerlangのプログラムをコマンドラインツールとして使う際に使うコマンドのようですが
詳しくは説明できないので, 説明は省略します.

mix.exs
defmodule MyCli.Mixfile do
  use Mix.Project

  def project do
    [app: :my_cli,
     version: "0.0.1",
     elixir: "~> 1.3-dev",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps,
     escript: escript_config #<-add
    ]
  end

  ...
  ...

  # add
  def escript_config do
    [ main_module: MyCli.CLI ]
  end
end

ビルドを実行する

mixコマンドを作ってビルドを行います.
使うコマンドはmix escript.buildです

$ mix escript.build
Compiled lib/my_cli.ex
Compiled lib/my_cli/cli.ex
Generated my_cli app
Consolidated List.Chars
Consolidated String.Chars
Consolidated Collectable
Consolidated Enumerable
Consolidated IEx.Info
Consolidated Inspect
Generated escript my_cli with MIX_ENV=dev
$
$ ls -al
total 2394
drwxrwxr-x   6 vagrant        vagrant      113 2016-04-18 11:52 .
drwx------  18 vagrant        vagrant     4096 2016-04-18 10:58 ..
-rw-rw-r--   1 vagrant        vagrant       41 2016-04-18 10:58 .gitignore
-rw-rw-r--   1 vagrant        vagrant      422 2016-04-18 10:58 README.md
drwxrwxr-x   3 vagrant        vagrant       16 2016-04-18 11:04 _build
drwxrwxr-x   2 vagrant        vagrant       23 2016-04-18 10:58 config
drwxrwxr-x   3 vagrant        vagrant       53 2016-04-18 10:59 lib
-rw-rw-r--   1 vagrant        vagrant      766 2016-04-18 11:52 mix.exs
-rwxrwxr-x   1 vagrant        vagrant  2446124 2016-04-18 11:52 my_cli #<-- 作成された実行ファイル
drwxrwxr-x   2 vagrant        vagrant       50 2016-04-18 10:58 test

動作確認をする

$ ./my_cli hoge -h --verbose true
this is my command line tool
["hoge", "-h", "--verbose", "true"]

見ての通り, コマンドに対する引数やオプションは, リストとしてmain関数への引数として渡されるので
あとはこれらの情報を使ってよしなに処理してください.

なお, コマンドライン引数の処理については, OptionParserというモジュールが標準で用意されているので, こちらを使うのが良いようです.

iex(2)> OptionParser.parse ["hoge", "-h", "--verbose", "true"], aliases: [h: :help]
OptionParser.parse ["hoge", "-h", "--verbose", "true"], aliases: [h: :help]
{[help: true, verbose: "true"], ["hoge"], []}

参考

Programming Elixir: Functional, Concurrent, Pragmatic, Fun : http://www.amazon.co.jp/Programming-Elixir-Functional-Concurrent-Pragmatic/dp/1937785580

OptionParser: http://elixir-lang.org/docs/stable/elixir/OptionParser.html

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
10