読者です 読者をやめる 読者になる 読者になる

もやもやエンジニア

IT系のネタで思ったことや技術系のネタを備忘録的に綴っていきます。フロント率高め。

Elixir 入門 ~ MIX AND OTP ~ その1 - Introduction to Mix

  • 実際にMixとOTPを使ったアプリケーションを作成していく。
  • ↓のようにKey-Valueなデータを扱うアプリを作る
CREATE shopping
OK

PUT shopping milk 1
OK

PUT shopping eggs 3
OK

GET shopping milk
1
OK

DELETE shopping eggs
OK
  • アプリケーションを作るために以下の3つのtoolを使う
    • OTP : Open Telecom Platform といい、Erlangから受け継いでいるライブラリ。フォールトトレトラントなシステムを作るために作成された。
    • Mix : ビルドツール。アプリケーションのコンパイルや依存関係の管理など様々な用途で使う
    • ExUnit : ElixirのUnitTest用

Our first project

  • mix new を使ってアプリケーションを作成していく。
  • mixはmix help でhelpを見ることができる。オンライン上のドキュメントは Mix v1.0.5 Documentation
  • --module オプションは作成されるmodule名を明示的に指定する。指定しないと自動でキャメルケースになる。この場合はKv
$ mix new kv --module KV
  • 実行するとkvディレクトリが作成され、その中にいくつかのファイルが作成される。次に各ファイルを見ていく。

Project compilation

  • mix.exs というファイルが作成されている。これはプロジェクトの設定や依存関係を管理する。
defmodule KV.Mixfile do
  use Mix.Project

  # projectという関数はアプリケーションの名前とバージョンを定義する
  def project do
    [app: :kv,
     version: "0.0.1",
     deps: deps]
  end

  # mix compile 時にここに書かれたアプリケーションが参照されて.appファイルに書き込まれる
  def application do
    [applications: [:logger]]
  end

  # deps は依存関係にあるhexのライブラリ群をListで書く。後述。
  defp deps do
    []
  end
end
$ cd kv
$ mix compile
  • すると_buildディレクトリの下に kv.appが作成される
  • パスは _build/dev/lib/kv/ebin/kv.app
  • デフォルトで登録されているloggerが出力されているのがわかる。他にもバージョンやアプリケーション名なども。詳しくは以降の章で。
{application,kv,
             [{registered,[]},
              {description,"kv"},
              {applications,[kernel,stdlib,elixir,logger]},
              {vsn,"0.0.1"},
              {modules,['Elixir.KV']}]}.% 
  • いったんプロジェクトをコンパイルした後にアプリケーションのルートでオプションをつけてREPLを起動すればアプリケーションのモジュールをロードした状態でREPLが起動する
iex -S mix

Running tests

  • mix new でアプリケーションを作成するとテスト用のモジュールも同時に作成される。テスト用のモジュールはtestディレクトリ配下にlibと同じ構成で作成する。今回は test/kv_test.exsが作成されている。
  • testファイルはコンパイルの必要がないので .exs ファイルで作成される。
  • モジュール名は対象のモジュール名 + Test と定義し、Testing APIを使うためにExUnit.Case を実装し、test/2 macroを使ってテストを書く。
defmodule KVTest do
  use ExUnit.Case

  test "the truth" do
    assert 1 + 1 == 2
  end
end
  • また、testディレクトリに test_helper.exs が作成されている。これはTestFrameworkを柔軟にセットアップするためのもので mix test でテストを走らせる際、必ず必要となる。
  • mix test でテストが走るが、テストの前にアプリケーションは再コンパイルされる。
  • mix test [ファイルパス] で走らせるテストを指定することもできる。
  • kv_test.exs の テストを変更して、testがfailになった場合の表示を確認しておく。
> mix test


  1) test the truth (KVTest)
     test/kv_test.exs:4
     Assertion with == failed
     code: 1 + 1 == 3
     lhs:  2
     rhs:  3
     stacktrace:
       test/kv_test.exs:5



Finished in 0.03 seconds (0.03s on load, 0.00s on tests)
1 tests, 1 failures

Randomized with seed 439788

Environments

  • Mixは環境の考え方をサポートしている
    • :dev : Mix taskがデフォルトで走るときの環境
    • :test : mix test 時の環境
    • :prod : プロダクションにアプリケーションを配置するときの環境
  • 環境ごとに異なる値を使いたいときはMix.Env機能を使う。Mix.envには現在使用している環境がatomで格納されている。
  # 自動生成されたmix.exsを見てみると Mix.env == :prod というコードがある。
  # Mix.env には atom でどの動いている環境が入っていることが分かる。
  def project do
    [app: :kv,
     version: "0.0.1",
     elixir: "~> 1.0",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps]
  end