- 実際に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