Elixir初心者がmix使う時に最低限必要そうなコマンド自分まとめ

# mixがんばる
ElixirでプログラミングをすすめるにあたってElixirのプロジェクト管理ツールの`mix`は避けて通れないと思ってきたので「これはいるやろ」ってコマンドをまとめてみました。


# 環境
OS: macOS High Sierra 10.13.6
Elixir: `% brew install elixir`でインストール

```shell
% iex --version
Erlang/OTP 21 [erts-10.1.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]

IEx 1.7.3 (compiled with Erlang/OTP 21)
```

# 概要
今のところ（2018.10.22時点）、mixのコマンドはコレだけでなんとかなりそうな予感。

- `mix new <プロジェクト名>`
- `mix deps.get`
- `mix escript.build` or `iex -S mix`

そのうち必要になるやろうねぇってのが`mix test`。

- `mix test`


## `mix new <プロジェクト名>`
実際には`<プロジェクト名>`は`PATH`らしいけどmixで新しいプロジェクトを作成する時に実行するコマンドは`mix new <プロジェクト名>`。カレントディレクトリに`<プロジェクト名>`のディレクトリが作成されるので、`cd <プロジェクト名>`して作業をすすめる。

プログラムファイルはlibディレクトリに置く。

ヘルプを参照する時は`mix help`か`mix help TASK`コマンドを実行するとOK。

```shell

% mix new <プロジェクト名>

% mix help
% mix help TASK
```


## `mix deps.get`
依存関係の解消を含めてライブラリの管理をしてくれるコマンド。プロジェクトディレクトリ内の`mix.exs`ファイルに必要な内容を記載した後、コマンドを実行する。基本的には[hex.pm](https://hex.pm/)からライブラリを取得してくれるみたいやけど、きちんと書けばGitからも取得できる。

```shell

依存関係を確認する
% mix deps

依存関係を解消（解決）する
% mix deps.get

ヘルプ
% mix help deps
% mix help deps.get
```


## `mix escript.build` or `iex -S mix`
mixで作成したプログラムをどうやって実行するかによってどちらを使うか決める。

### `mix escript.build`の場合
escriptって仕組みを使って実行ファイルをビルドすると、実行ファイルが出来上がる。本番環境にデプロイする時はこっちかなぁ〜。


### `iex -S mix`の場合
開発、テストしゆ時はこっちかなぁ〜。でも、エディタの機能でなんとかなりそうかなぁ〜。


# 実践
コマンドに引数となるテキストを渡すと末尾に「ぜよ！」を付けて返すバイナリファイルを作ってみます。

まず`mix_test`というmixプロジェクトを作って、お約束のテストを実行。

```shell
% mix new mix_test

* creating README.md
* creating .formatter.exs
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/mix_test.ex
* creating test
* creating test/test_helper.exs
* creating test/mix_test_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

    cd mix_test
    mix test

Run "mix help" for more commands.



% cd mix_test



% mix test
Compiling 1 file (.ex)
Generated mix_test app
..

Finished in 0.07 seconds
1 doctest, 1 test, 0 failures

Randomized with seed 571241
```

次に、末尾に「ぜよ！」を付けて返すプログラムをエラー処理とか引数いろいろあった場合は考慮せず作ります。
`escript.build`してプログラムを実行する時は`main/1`関数が必要なので作っておきます。ついでに引数のデフォルトを`""`にします。

```elixir:lib/zeyo.ex
defmodule Zeyo do

  def main(args \\ "") do
    args
    |> addTail
  end

  defp addTail(text) do
    IO.puts("#{text}ぜよ！")
  end

end
```

んで、`mix.exs`ファイルに`escript.build`するための設定行を追記します。`Zeyo`モジュールに`main/1`があるのでmain_moduleでZeyoを呼びます。

```elixir:mix.exs
defmodule MixTest.MixProject do
  use Mix.Project

  def project do
    [
      app: :mix_test,
      version: "0.1.0",
      elixir: "~> 1.7",
      escript: [main_module: Zeyo],    # ←この行を追記
      start_permanent: Mix.env() == :prod,
      deps: deps()
    ]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger]
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"},
    ]
  end
end
```

いよいよビルド。

```shell
% mix escript.build
Compiling 2 files (.ex)
Generated mix_test app
Generated escript mix_test with MIX_ENV=dev
```

おっ。ちゃんとバイナリファイル「mix_test」ができちゅう。

```shell
% ls
README.md  _build/    config/    lib/       mix.exs    mix_test*  test/
```

最後にコマンドを実行して遊んでみた。

```shell
引数がない場合
% ./mix_test
ぜよ！

引数がある場合
% ./mix_test mix
mixぜよ！

引数が2バイト文字の比較
% ./mix_test はろーわーるど
はろーわーるどぜよ！
% ./mix_test "はろーわーるど"
はろーわーるどぜよ！
```



# まとめ
`mix`を使うにあたって現時点で最低限必要そうなコマンドをまとめて作ってみました。もっと増やせるようにしたいな。
`mix deps.get`するのを忘れちょったき、次は`mix deps.get`することを考えます。


# 参考サイト

- [escript how to](https://qiita.com/ohr486/items/ab8c69fdc5358e649fd8)
- [Elixir School 実行ファイル](https://elixirschool.com/ja/lessons/advanced/escripts/)
- [Elixirでコマンドラインツールを作る](https://qiita.com/niku/items/5b7967d88cae58e034e2)