Elixirでコマンドラインアプリケーションを作る

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

プログラマーは普段の仕事を簡単にするために、各々便利なスクリプトを作り活用しています。
使用するプログラミング言語はどれでも良いのですが、簡単に書けて楽にCLIアプリケーションとしてビルド、リリースできる仕組みがあるとありがたいです。
ElixirにはCLIアプリケーションを簡単に作成できる escript というツールが用意されています。
今回はElixirでCLIアプリケーションを作成してみます(検証したelixirのversionは1.3.2です)。

環境構築は以下のページを参照してください。
MacにElixir開発環境を構築する

プロジェクト作成

ますコマンドラインアプリケーションのプロジェクトを作成しましょう。

mix new cli_demo

escript

escriptはElixirのアプリケーションをCLIアプリケーションとしてコンパイルする仕組みです。
これを使うには、mix.exsファイルに以下の行を追加します。

    def project do
      [app: :cli_demo,
       escript: [main_module: CliDemo.CLI], # この行を追加します
       version: "0.0.1",
       elixir: "~> 1.3",
       build_embedded: Mix.env == :prod,
       start_permanent: Mix.env == :prod,
       deps: deps()]
    end

エントリポイントの作成

CLIアプリケーションのエントリポイントとなるモジュールを作成します

  • projectroot/lib/cli_demo/cli.ex
      
    defmodule CliDemo.CLI do
      # ここがCLIアプリケーションのエンドポイント
      def main(argv) do
        parse_args(argv)
        |> process
      end
         
      # 引数をパースする処理
      def parse_args(argv) do
        parse = OptionParser.parse(argv,
                                   switches: [ help: :boolean], # boolean型に変換する
                                   aliases: [h: :help]) # :helpに変換する
    
        case parse do
         
          { [ help: true ], _, _}
            -> :help
        
          { _, message, _}
            -> message
         
          _ -> :help
        end
      end
    
      def process(:help) do
        IO.puts """
        usage: cli_demo <message>
        """
        System.halt(0)
      end   
        
      def process(message) do
        IO.puts message
      end
    end
    

コマンドライン引数のパース処理には OptionParserライブラリを使用しています。
本題とずれるので説明は省略しますが、-hを引数には渡すと:helpに変換され、文字列がbooleanに変換されます

アプリケーションのビルド、インストール

ビルドしてCLIアプリケーションを作成します。作成したバイナリはホームディクトリの下の.mix/escriptsに保存されるので、環境変数PATHに追加しておく必要があります。

環境変数の設定

私はZSHを使っているので.zshrcに設定しました。書き込むファイルは使っているシェルによって変えてください。

export PATH="$HOME/.mix/escripts:$PATH"

ビルド、インストール

$ mix do escript.build, escript.install
Generated escript cli_demo with MIX_ENV=dev
Are you sure you want to install escript "cli_demo"? [Yn] y
* creating /Users/username/.mix/escripts/cli_demo

実行

早速、実行してみましょう

$ cli_demo "Elixir Rocks"
Elixir Rocks

ヘルプメッセージも実装通りに表示されます

$ cli_demo -h
usage: cli_demo <message>

まとめ

簡単にコマンドラインアプリケーションを作る環境が用意されているのは非常にありがたいです。
が、できればhex.pm(パッケージマネージャー, RubeGemsのElixir版)やGitHubからコマンド一発でインストールしたいものです。
現在開発版のバージョン1.4ではまさにこれらの機能が実現される予定です
mixの公式ドキュメント

  • GitHubからのインストール

    mix escript.install github user/project
    

  • hex.pmからのインストール

    mix escript.install hex hex_package