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

Зонтичные проекты

Со временем ваш проект может вырасти до очень больших размеров. Для таких случаев инструмент Mix позволяет разделить код проекта на несколько приложений и сделать ваши проекты на Elixir более управляемыми по мере развития.

Введение

Зонтичный проект создаётся так же, как и любой другой 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 создал для нас небольшой проект-заготовку с двумя директориями:

Подпроекты

Давайте перейдём в директорию machine_learning_toolkit/apps нашего примера, и создадим там три обычных приложения с помощью Mix, следующим образом:

$ 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
│   │   ├── lib
│   │   │   └── datasets.ex
│   │   ├── mix.exs
│   │   └── test
│   │       ├── datasets_test.exs
│   │       └── test_helper.exs
│   ├── svm
│   │   ├── README.md
│   │   ├── lib
│   │   │   └── svm.ex
│   │   ├── mix.exs
│   │   └── test
│   │       ├── svm_test.exs
│   │       └── test_helper.exs
│   └── utilities
│       ├── README.md
│       ├── 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 командой iex -S mix — мы сможем нормально взаимодействовать со всеми проектами. Давайте, для примера, изменим код приложения 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
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!