凛「じゃ、今回はMixの話にゃ!」
希「開発用のツールやったっけ?」
凛「プロジェクト作成からテストまで面倒を見てくれるプロジェクト管理ツールだよ」
凛「早速だけどWindowsだとうまく動かなかったから、Windows+Cygwinの人は.bashrcにこう書くといいにゃ」
1 |
alias mix="C:/Program\ Files/Elixir/bin/mix" |
凛「使える状態になっていれば、起動するとこうなるはずだよ」
1 2 |
$ mix ** (Mix) Could not find a Mix.Project, please ensure a mix.exs file is available |
海未「ここまでは大丈夫そうです」
凛「早速プロジェクトを作ってみるにゃ」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ mix new fizzbuzz * creating README.md * creating .gitignore * creating mix.exs * creating config * creating config/config.exs * creating lib * creating lib/fizzbuzz.ex * creating test * creating test/test_helper.exs * creating test/fizzbuzz_test.exs Your mix project was created successfully. You can use mix to compile it, test it, and more: cd fizzbuzz mix test Run `mix help` for more commands. |
凛「これで必要なファイルは全部できたから、あとは要所要所編集していくだけで出来上がりにゃ!」
海未「これだけで、ですか?」
凛「そうだよ。最近のツールは頭がいいにゃ~」
- README.md
- プロジェクトの説明(Markdown形式)
- .gitignore
- バージョン管理下に置く必要のないファイルのデフォルト設定
- mix.exs
- プロジェクトの設定
- config/*
- アプリケーションの設定
- lib/*
- アプリケーションのメインロジック
- test/*
- ユニットテスト
凛「こんな構成にゃ」
希「設定ファイルも全部Elixirで書いてあるんやね」
凛「設定からやっていくにゃ。まずはmix.exsを開いて、アプリケーションのメインモジュールがどれかを指定するにゃ」
1 2 3 4 5 6 7 8 9 |
def project do [app: :fizzbuzz, version: "0.0.1", elixir: "~> 1.0", escript: [main_module: Fizzbuzz], # 追記 build_embedded: Mix.env == :prod, start_permanent: Mix.env == :prod, deps: deps] end |
希「Fizzbuzzはlib/fizzbuzz.exにあるやつかな」
凛「うん。空のモジュールを生成してくれてるから、これからそこに処理を書いていくんだよ」
凛「まずはここまででビルドしてみるにゃ」
1 2 3 4 5 |
$ cd fizzbuzz $ mix escript.build Compiled lib/fizzbuzz.ex Generated fizzbuzz app Generated escript fizzbuzz with MIX_ENV=dev |
凛「うまくいくと、fizzbuzzってファイルができてるはずにゃ」
海未「ありますね。これが実行ファイルでしょうか」
凛「そうなんだけど・・・」
1 2 3 4 |
$ ./fizzbuzz ** (UndefinedFunctionError) undefined function: Fizzbuzz.main/1 (fizzbuzz) Fizzbuzz.main([]) (elixir) lib/kernel/cli.ex:70: anonymous fn/3 in Kernel.CLI.exec_fun/2 |
凛「mainって名前の関数が必要にゃ。これはお約束だよ」
1 2 3 4 5 |
defmodule Fizzbuzz do def main(args) do end end |
凛「とりあえず何もしない実装をしてみると・・・」
1 2 3 4 5 6 7 |
$ mix escript.build lib/fizzbuzz.ex:2: warning: variable args is unused Compiled lib/fizzbuzz.ex Generated fizzbuzz app Generated escript fizzbuzz with MIX_ENV=dev $ ./fizzbuzz |
凛「これでエラーは出なくなって、雛形はできあがりにゃ」
海未「あとは実装ですね」
凛「FizzBuzzっていう伝統芸能みたいなプログラムがあって、3の倍数の時にはハラショー、5の倍数の時にはちゅんちゅん、3と5の公倍数の時にはにっこにっこにー☆と出力するらしいにゃ」
希「いや絶対嘘やろそれ」
1 2 3 4 5 6 7 8 9 10 11 |
defmodule Fizzbuzz do def main(args) do x = String.to_integer hd args cond do rem(x, 3) == 0 and rem(x, 5) == 0 -> IO.puts "にっこにっこにー☆" rem(x, 3) == 0 -> IO.puts "ハラショー" rem(x, 5) == 0 -> IO.puts "ちゅんちゅん" true -> IO.puts x end end end |
凛「これをビルドして・・・」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ mix escript.build Compiled lib/fizzbuzz.ex Generated fizzbuzz app Generated escript fizzbuzz with MIX_ENV=dev $ ./fizzbuzz 1 1 $ ./fizzbuzz 3 ハラショー $ ./fizzbuzz 5 ちゅんちゅん $ ./fizzbuzz 15 にっこにっこにー☆ |
凛「完成にゃ!」
海未「ずいぶん簡単でしたね」
凛「こういうツールは、規模が大きくなるともっとありがたみがわかってくるはずにゃ」
凛「次回も、凛が続けていいかな?」
希「今度は何やるん?」
凛「Mixを使ってね、ユニットテストが簡単に作れるんだよ」
海未「そういえば、テストコードも生成されていましたね」
凛「だから、ユニットテストをやってみるにゃ!」