Do you want to pick up from where you left of?
Take me there

アンブレラプロジェクト

プロジェクトが大きく、本当に大きくなることが時々あります。Mixビルドツールはプロジェクトの成長に合わせて、コードを複数のアプリケーションに分割してElixirプロジェクトをより管理しやすくする方法を提供します。

導入

アンブレラプロジェクト(umbrella project)を作るには普通のMixプロジェクトを始めるように、しかし --umbrella フラグを渡してプロジェクトを作成します。ここでは例として機械学習ツールキットの シェル を作ります。なぜ機械学習ツールキットなのでしょうか?機械学習ツールキットは様々な異なる学習アルゴリズムやユーティリティ関数から成るからです。

$ mix new machine_learning_toolkit --umbrella

* creating .gitignore
* creating README.md
* creating mix.exs
* creating apps
* creating config
* creating config/config.exs

Your umbrella project was created successfully.
Inside your project, you will find an apps/ directory
where you can create and host many apps:

    cd machine_learning_toolkit
    cd apps
    mix new my_app

Commands like "mix compile" and "mix test" when executed
in the umbrella project root will automatically run
for each application in the apps/ directory.

シェルコマンドから分かる通り、Mixは2つのディレクトリのみで構成される小さい骨組みだけのプロジェクトを作ります:

子プロジェクト

プロジェクトの machine_learning_toolkit/apps ディレクトリに移動し、Mixでこのように通常のプロジェクトを3つ作ります:

$ mix new utilities

* creating README.md
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/utilities.ex
* creating test
* creating test/test_helper.exs
* creating test/utilities_test.exs

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

    cd utilities
    mix test

Run "mix help" for more commands.


$ mix new datasets

* creating README.md
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/datasets.ex
* creating test
* creating test/test_helper.exs
* creating test/datasets_test.exs

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

    cd datasets
    mix test

Run "mix help" for more commands.

$ mix new svm

* creating README.md
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/svm.ex
* creating test
* creating test/test_helper.exs
* creating test/svm_test.exs

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

    cd svm
    mix test

Run "mix help" for more commands.

プロジェクトのディレクトリ構造はこのようになっているはずです:

$ tree
.
├──README.md
├──apps
│   ├──datasets
│   │   ├──README.md
│   │   ├──config
│   │   │   └──config.exs
│   │   ├──lib
│   │   │   └──datasets.ex
│   │   ├──mix.exs
│   │   └──test
│   │       ├──datasets_test.exs
│   │       └──test_helper.exs
│   ├──svm
│   │   ├──README.md
│   │   ├──config
│   │   │   └──config.exs
│   │   ├──lib
│   │   │   └──svm.ex
│   │   ├──mix.exs
│   │   └──test
│   │       ├──svm_test.exs
│   │       └──test_helper.exs
│   └──utilities
│       ├──README.md
│       ├──config
│       │   └──config.exs
│       ├──lib
│       │   └──utilities.ex
│       ├──mix.exs
│       └──test
│           ├──test_helper.exs
│           └──utilities_test.exs
├──config
│   └──config.exs
└──mix.exs

アンブレラプロジェクトのルートディレクトリに戻ると、コンパイルのような代表的なコマンドが全て使えることが分かります。サブプロジェクトは通常のプロジェクトなので、サブプロジェクトのディレクトリに移動すれば通常通りMixが許す限り全てのことが可能です。

$ mix compile

==> svm
Compiled lib/svm.ex
Generated svm app

==> datasets
Compiled lib/datasets.ex
Generated datasets app

==> utilities
Compiled lib/utilities.ex
Generated utilities app

Consolidated List.Chars
Consolidated Collectable
Consolidated String.Chars
Consolidated Enumerable
Consolidated IEx.Info
Consolidated Inspect

IEx

もしかしたら、アプリケーションとやりとりする方法がアンブレラプロジェクトでは少し異なるのではないか、と思っているかもしれません。信じるにしろ信じないにしろ、それは間違いです!トップレベルディレクトリに移動し、 iex -S mix でIExを起動すると通常通りプロジェクト全てとやりとりできます。簡単な例として apps/datasets/lib/datasets.ex の内容を変更してみましょう。

defmodule Datasets do
  def hello do
    IO.puts("Hello, I'm the datasets")
  end
end
$ iex -S mix
Erlang/OTP {{ site.erlang.OTP }} [erts-{{ site.erlang.erts }}] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

==> datasets
Compiled lib/datasets.ex
Consolidated List.Chars
Consolidated Collectable
Consolidated String.Chars
Consolidated Enumerable
Consolidated IEx.Info
Consolidated Inspect
Interactive Elixir ({{ site.elixir.version }}) - press Ctrl+C to exit (type h() ENTER for help)

iex> Datasets.hello
Hello, I'm the datasets
:ok
間違いを報告したい、あるいはこのレッスンに貢献したい? このレッスンをGitHubで編集しよう!