Help us understand the problem. What is going on with this article?

`mix new`で作られるファイル探索

More than 5 years have passed since last update.

Elixirのビルドツールmixにより作成できる,Elixirプロジェクトの雛形構成を見ていきます.

mixとは

Elixirプロジェクトの作成や依存解決,コンパイル,テストを行うビルドツール.
Clojureのビルドツールleingenを参考に作られている.(そのコントリビュータの1人はelixirの開発にも関わっている)

leingenさん
leingen

ファイル構成

プロジェクト作成コマンドのmix newでは以下のようなファイルが作成される.

$ mix new nyaa
* creating README.md
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/nyaa.ex
* creating lib/nyaa
* creating lib/nyaa/supervisor.ex
* creating test
* creating test/test_helper.exs
* creating test/nyaa_test.exs

Your mix project was created successfully.
You can use mix to compile it, test it, and more:

    cd nyaa
    mix compile
    mix test

Run `mix help` for more information.

$ cd ./nyaa
$ tree
.
├── README.md
├── lib
│   ├── nyaa
│   │   └── supervisor.ex
│   └── nyaa.ex
├── mix.exs
└── test
    ├── nyaa_test.exs
    └── test_helper.exs

3 directories, 6 files

lib/nyaa.ex

アプリケーションの起動/停止の振舞いを記述するファイル.停止(stop/1)はuse Application.Behaviourすればデフォルトのものを利用できるので,start/2のみ実装すればよい

lib/nyaa.ex
defmodule Nyaa do
  use Application.Behaviour

  # See http://elixir-lang.org/docs/stable/Application.Behaviour.html
  # for more information on OTP Applications
  def start(_type, _args) do
    Nyaa.Supervisor.start_link
  end
end

lib/nyaa/supervisor.ex

上で呼んでいるNyaa.Supervisor.start_linkを定義している.
:supervisor.start_link(__MODULE__, [])は,カレントモジュールをsupervisorとして定義するということ([]はinitの引数として渡される)

supervise(children, strategy: :one_for_one):one_for_oneは監視しているプロセス(child)が落ちたらそのプロセスだけ再起動するという意味.他にも監視プロセス全てを再起動する:one_for_allなどがある.オプション一覧は http://elixir-lang.org/docs/stable/Supervisor.Behaviour.html を参照.

lib/nyaa/supervisor.ex
defmodule Nyaa.Supervisor do
  use Supervisor.Behaviour

  def start_link do
    :supervisor.start_link(__MODULE__, [])
  end

  def init([]) do
    children = [
      # Define workers and child supervisors to be supervised
      # worker(Nyaa.Worker, [])
    ]

    # See http://elixir-lang.org/docs/stable/Supervisor.Behaviour.html
    # for other strategies and supported options
    supervise(children, strategy: :one_for_one)
  end
end

mix.exs

アプリケーションの設定ファイル.依存ライブラリやなどを記述する

test/nyaa_test.exs, test/test_helper.exs

名前の通りテストの雛形.rspecのような書き方

test/nyaa_test.exs
defmodule NyaaTest do
  use ExUnit.Case

  test "the truth" do
    assert(true)
  end
end

次の一歩

この時点ではsupervisorしかいないので,workerをNyaa.Workerとして作成していく.

参考リンク

yaotti
Qiitaを作っているIncrements株式会社の創業者
http://yaotti.hatenablog.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away