escript how to

# escript how to

![dac2017.png](https://qiita-image-store.s3.amazonaws.com/0/28174/9a0d8504-311b-fa4b-fb04-8d93b4d7b5f4.png)

これは[Drecomアドベントカレンダー](https://adventar.org/calendars/2575)18日目の記事です。
17日は[hayabusa333](https://twitter.com/hayabusa333)さんによる[Elixir環境構築にて暗号化でエラーにならないために](https://tech.drecom.co.jp/erlang-install-openssl/)でした。

![elixir-logo.png](https://qiita-image-store.s3.amazonaws.com/0/28174/0b7ab74f-c4ae-78c5-c7a5-2e532cc31768.png)

ドリコムでエンジニアをやっている[おーはら](https://twitter.com/ohrdev)です。
Elixirのプログラムはmixを使ってプロジェクトとして作成・管理します。このプログラムを実行する際

* 関連ライブラリの取得(``mix deps.get``)
* コンパイル(``mix compile``)
* 実行(``iex -S mix``)

といった手順が必要になるのですが、escriptを使うことで、簡単にElixirプログラムを実行することができます。

## escriptとは

escriptはElixirプログラムをコマンドラインから呼び出すことができる実行ファイルです。
escriptプログラムの実行にはErlangがインストールされている事が必要です、つまりElixirが無くてもescriptを実行する事ができます。実はElixir自体がescriptに組み込まれているので、Elixirがインストールされていない環境でもErlangさえあればescriptを実行する事ができるのです。

escriptの管理はmixを使って行います。主なコマンドは以下となります。

| コマンド | 説明 |
| :---- | :-- |
| mix escript | ローカルにインストールされたescriptを表示 |
| mix escript.build | escriptプログラムを作成 |
| mix escript.install | escriptプログラムをローカルにインストール |
| mix escript.uninstall | escriptプログラムをローカルからアンインストール |

mixコマンドでインストールしたescriptプログラムは、HOME/.mix/escripts 以下に配置されます。

![escript-1.png](https://qiita-image-store.s3.amazonaws.com/0/28174/4f8ec821-ffeb-6000-e505-921801a952f8.png)

## escriptプログラムの作成

escriptを使ったコマンドラインツールを作成していきましょう。escriptのプロジェクトは通常のElixirプロジェクトと作成方法は同じで、``mix new``を使って作成します。

![cli-1.png](https://qiita-image-store.s3.amazonaws.com/0/28174/2390fa9e-23e7-16ed-d519-50cdb31e2f82.png)

escriptプロジェクトと通常のElixirプロジェクトの違いは以下の3点です。

* mix.exsのprojectのescriptキーにmain_moduleのパラメータを設定する
* escriptのmain_moduleで指定したモジュールにmain関数を実装する
* escriptの実行時にmainモジュールのmain関数が実行される

実際にescriptプログラムを作成、実行してみましょう。

### main_moduleの設定

プロジェクトディレクトリ以下のmix.exsを以下の様に変更します。

![cli-2.png](https://qiita-image-store.s3.amazonaws.com/0/28174/d1f31052-4ff3-edbf-484f-23ba7f9ba0fb.png)

project関数内のキーワードリストに、escriptをキーとする

``escript: [main_module: <モジュール>]``

を追加して、escript実行時に実行されるmainモジュールを指定します。サンプルコードでは、CliDemoモジュールをescript実行時に呼ばれるモジュールとして設定しています。

### main関数の実装

escriptの実態は、``mix.exs``で指定したmainモジュールのmain関数です。前節でメインモジュールを``CliDemo``と設定したので、CliDemoモジュールにmain関数を実装します。
なお、``CliDemoはlib/cli_demo.ex``として``mix new``時に作成されます。

![cli-3.png](https://qiita-image-store.s3.amazonaws.com/0/28174/e8e8fd37-d769-17ad-772d-ed6490dca504.png)

main関数はIOモジュールのputs関数を使って、標準出力にメッセージを表示させるだけです。

### escriptのビルド

main関数の実装が完了したので``mix escript.build``でescriptをビルドします。

![cli-4.png](https://qiita-image-store.s3.amazonaws.com/0/28174/31a1eac2-d891-417e-34ef-1901ddd3009a.png)

プロジェクトディレクトリに``cli_demo``という実行ファイルが生成されます。

![cli-5.png](https://qiita-image-store.s3.amazonaws.com/0/28174/fb53a5de-04da-ec75-6037-abeb7bcd7f72.png)

### escriptの実行

``cli_demo``は実行ファイルなので、これを以下の様に実行すると標準出力にメッセージが出力されます。

![cli-6.png](https://qiita-image-store.s3.amazonaws.com/0/28174/fb719644-46b4-a651-ca6c-250269fc7033.png)

## escriptプログラムのインストール

``mix escript.build``で実行ファイルをビルドしましたが、``mix escript.install``でビルド済みのescript実行ファイルを取得する事ができます。以下の3つからescriptを取得する事ができます。

* ローカルのescriptプロジェクト
* git(github)リポジトリ
* hex.pm

取得した実行ファイルは、``HOMEディレクトリ/.mix/escripts``に保存されます。

### ローカルのescriptプロジェクトからinstall

ローカル環境のescriptプロジェクトがある場合、プロジェクトディレクトリで``mix escript.install``でescriptをインストールできます。

![cli-8.png](https://qiita-image-store.s3.amazonaws.com/0/28174/d6a0ee30-4244-9d0f-eb26-aae9e0078a9b.png)

``mix escript``でinstallした``cli_demo``があることを確認できます。

### git(github)リポジトリからinstall

githubのプロジェクトからescriptをインストールするコマンドは以下です。

| コマンド |
|:------|
| mix escript.install github {user}/{project}|
| mix escript.install github {user}/{project} branch {対象のブランチ} |
| mix escript.install github {user}/{project} tag {対象のタグ} |
| mix escript.install github {user}/{project} ref {対象のリファレンス} |

デモプロジェクトの``https://github.com/ohr486/escript_demo``のescriptをインストールすると以下の様になります。

![cli-9.png](https://qiita-image-store.s3.amazonaws.com/0/28174/1bef379d-1fe5-9197-bc89-c1d8649d27f8.png)

オプションを何も指定しない場合は、masterブランチのescriptがインストールされます。

### hex.pmからinstall

hex.pmからescriptをインストールするには、以下のコマンドを使います。

| コマンド |
|:----- |
| mix escript.install hex {パッケージ} |
| mix escript.install hex {パッケージ} {バージョン} |

### インストールしたescriptの実行

インストールしたescriptファイルを実行するには、escriptのインストール先ディレクトリ``ホームディレクトリ/.mix/escripts``を実行パスに含めます。
MacOSの場合は、``.bash_profile``や``.profile``なりに、

```
export PATH=ホームディレクトリ/.mix/escripts:$PATH
```

を追加してください。
インストールしたデモプログラムを実行すると、以下の様になります。

![exec-demo.png](https://qiita-image-store.s3.amazonaws.com/0/28174/42af059e-2ed1-dbf3-ddfa-e21aecc4c160.png)

## まとめ

escriptプログラムの作成・インストール方法を紹介しました。
ちょっとしたプログラムを扱うにはちょうど良い方法なので、試して見てはいかがでしょうか？