手順
- プロジェクトを作成する
- エントリポイントとなるモジュールを作成する
- mix.exsを編集する
- ビルドを実行する
- 動作確認をする
プロジェクトを作成する
> mix new my_cli
エントリポイントとなるモジュールを作成する
エントリポイントとなるモジュールは, main/1
という関数を含んでいること以外に
特に制約はないようです.
今回は, ネタ元にしたがって, 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のプログラムをコマンドラインツールとして使う際に使うコマンドのようですが
詳しくは説明できないので, 説明は省略します.
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