elixirだ 第5回

38
第5回 - あなたとMix - GMO Pepabo, Inc. Joe Honzawa 2015/06/11 Elixir勉強会 Elixirだ

Upload: joenoh

Post on 31-Jul-2015

249 views

Category:

Internet


0 download

TRANSCRIPT

第5回 - あなたとMix -

GMO Pepabo, Inc. Joe Honzawa

2015/06/11 Elixir勉強会

Elixirだ

前回やったこと> モニタとリンク > supervisor

今回の内容> Mix > ドキュメンテーション > タスクを作ろう > Dialyzerで型チェック

テストとか前にやったのはスキップ

ゴール> ドキュメント書けるようになる > タスク作れるようになる > Dialyzerは「へー」って感じで

なぜ> ライブラリ公開するなら > みんなが使える形式で配布 > ドキュメントは必須 > 関数の使い方や仕様 > 使いやすくしなきゃね

マナーみたいなものですね

Mixおさらい> Rubyにおけるbundlerとrake > 依存性解決 > タスクランナー > mix new my_app > mix test > mix something.i.defined

ドキュメンテーション

の前に

モジュール属性

@なんちゃら

defmodule M do @the_value 3

def fun, do: @the_value end

モジュール属性> 他言語での定数みたいに使う > Joe-noh/japanese_holiday

> コンパイル終了後、原則消える > 実行時にはアクセスできない > 当然、編集もできない

予約されてる属性> @doc > @moduledoc > @shortdoc > @type > @spec > @behaviour > @external_resource  など

ドキュメンテーション

さあ!

$ cd fibonacci

lib/fibonacci.exdefmodule Fibonacci do @moduledoc """ フィボナッチなモジュールだよ

* みんなも * 一緒に * フィボナッチ! """

lib/fibonacci.ex @doc """ 次のフィボナッチ数を返す

iex> Fibonacci.next 0 iex> Fibonacci.next 1 """ def next do # 略 end

ほいさ$ iex -S mix

iex(1)> h Fibonacci

iex(2)> h Fibonacci.next

ポイント> @moduledocでモジュールの説明

> @docで関数の説明

> Markdown使える

mix.exsdefp deps do latest = ">= 0.0.0"

[ {:ex_doc, latest, only: :docs}, {:earmark, latest, only: :docs} ] end

$ mix docs するために必要

ほいさ$ mix deps.get $ mix deps.compile

$ MIX_ENV=docs mix docs

$ open doc/index.html

hexdocsに公開

$ mix hex.user register

$ mix hex.publish $ mix hex.docs

> https://hex.pm/docs/publish

タスクを作ろう

タスク

$ mix phoenix.new

$ mix phoenix.gen.html

$ mix ecto.migrate

> よくやることをまとめておく > プロジェクトの初期化や生成 > 運用に関わる作業

目標

$ mix help :

mix escript.build # Builds … mix fib # フィボナッチ! mix help # Print … :

fibタスクをつくる

どこに書く

$ mkdir -p lib/mix/tasks

$ touch lib/mix/tasks/fib.ex

慣習> lib/mix/tasks以下に書く > mix foo なら > lib/mix/tasks/foo.ex > mix foo.bar なら > lib/mix/tasks/foo.bar.ex

これちょっと注意

fib.exdefmodule Mix.Tasks.Fib do use Mix.Task

def run([num]) do Application.start(:fibonacci)

num = String.to_integer(num)

1..num |> Enum.map(fn _ -> Fibonacci.next end) |> Enum.each(&IO.puts/1) end end

ポイント> use Mix.Task > run/1を定義 > 引数はList > 文字列で渡ってくる > mix fib 3 なら引数は ["3"] > OptionParser 便利

fibある?

$ mix help

fib.exdefmodule Mix.Tasks.Fib do use Mix.Task

@shortdoc "フィボナッチ!"

def run([num]) do # 略 end end

mix helpで表示するには@shortdocが必要!

fib見えた?

$ mix compile

$ mix help

Dialyzerで 型チェック

mix.exsdefp deps do latest = ">= 0.0.0"

[ {:ex_doc, latest, only: :docs}, {:earmark, latest, only: :docs}, {:dialyze, latest, only: :dev} ] end

よしなにやってくれる便利ライブラリ

lib/fibonacci.exdefmodule Fibonacci do # 中略

@spec next() :: integer | no_return def next do # 略 end end

lib/fibonacci/server.ex

defmodule Fibonacci.Server do @type server :: pid | atom

# 中略 @spec next(server) :: integer | no_return def next(pid) do # 略 end end

発熱注意

$ mix deps.get $ mix deps.compile

$ mix dialyze

なんぞ> @specで関数の仕様を記述 > @typeで自分で型を定義

> 詳しくは公式を参照 > Kernel.Typespec

今回やったこと> Mix > ドキュメンテーション > タスクを作ろう > Dialyzerで型チェック