mixがんばる
ElixirでプログラミングをすすめるにあたってElixirのプロジェクト管理ツールのmix
は避けて通れないと思ってきたので「これはいるやろ」ってコマンドをまとめてみました。
環境
OS: macOS High Sierra 10.13.6
Elixir: % brew install elixir
でインストール
% 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
oriex -S mix
そのうち必要になるやろうねぇってのがmix test
。
mix test
mix new <プロジェクト名>
実際には<プロジェクト名>
はPATH
らしいけどmixで新しいプロジェクトを作成する時に実行するコマンドはmix new <プロジェクト名>
。カレントディレクトリに<プロジェクト名>
のディレクトリが作成されるので、cd <プロジェクト名>
して作業をすすめる。
プログラムファイルはlibディレクトリに置く。
ヘルプを参照する時はmix help
かmix help TASK
コマンドを実行するとOK。
% mix new <プロジェクト名>
% mix help
% mix help TASK
mix deps.get
依存関係の解消を含めてライブラリの管理をしてくれるコマンド。プロジェクトディレクトリ内のmix.exs
ファイルに必要な内容を記載した後、コマンドを実行する。基本的にはhex.pmからライブラリを取得してくれるみたいやけど、きちんと書けばGitからも取得できる。
依存関係を確認する
% 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プロジェクトを作って、お約束のテストを実行。
% 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
関数が必要なので作っておきます。ついでに引数のデフォルトを""
にします。
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を呼びます。
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
いよいよビルド。
% mix escript.build
Compiling 2 files (.ex)
Generated mix_test app
Generated escript mix_test with MIX_ENV=dev
おっ。ちゃんとバイナリファイル「mix_test」ができちゅう。
% ls
README.md _build/ config/ lib/ mix.exs mix_test* test/
最後にコマンドを実行して遊んでみた。
引数がない場合
% ./mix_test
ぜよ!
引数がある場合
% ./mix_test mix
mixぜよ!
引数が2バイト文字の比較
% ./mix_test はろーわーるど
はろーわーるどぜよ!
% ./mix_test "はろーわーるど"
はろーわーるどぜよ!
まとめ
mix
を使うにあたって現時点で最低限必要そうなコマンドをまとめて作ってみました。もっと増やせるようにしたいな。
mix deps.get
するのを忘れちょったき、次はmix deps.get
することを考えます。