Projekty zbiorcze
Z czasem projekt może stać się duży, naprawdę duży. Mix pozwala nam na podzielenie naszego projektu na mniejsze aplikacje, łatwiejsze w utrzymaniu i zarządzaniu. Projekty, które składają się z wielu mniejszych podprojektów, nazywamy projektami zbiorczymi albo — po angielsku — umbrella projects.
Wprowadzenie
Tworzenie projektu zbiorczego przebiega prawie tak samo, jak zwykłego, jedyną różnicą jest flaga --umbrella.
W naszym przykładzie stworzymy powłokę na potrzeby narzędzia do uczenia maszynowego.
Dlaczego właśnie uczenie maszynowe? A dlaczego nie? Tego typu projekty zawierają zazwyczaj wiele algorytmów uczenia i różnych użytkowych funkcji.
$ 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.Jak widać po wpisach w konsoli, Mix stworzył niewielki szkielet projektu zawierający dwa katalogi:
- 
apps/— gdzie będą znajdować się podprojekty,
- 
config/— gdzie przechowywana jest konfiguracja projektu zbiorczego.
Projekty potomne
Przejdźmy do katalogu machine_learning_toolkit/apps i za pomocą Mixa stwórzmy trzy zwykłe projekty:
$ 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.Nasze drzewo katalogów powinno wyglądać teraz tak:
$ 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.exsJeżeli wrócimy do katalogu projektu zbiorczego, będziemy mogli zobaczyć jak działają typowe zadania Mixa, takie jak kompilacja. Ponieważ projekty potomne to zwyczajne aplikacje, zawsze możemy też wejść do ich katalogów i bez żadnych problemów wywołać tam wszystkie rzeczy, które zwykle udostępnia nam 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 InspectIEx
Możesz pomyśleć, że interakcja w IEx z aplikacjami w projekcie zbiorczym będzie wyglądać nieco inaczej niż zwykle.
Cóż — wierz lub nie, ale zupełnie tak nie jest! Jeśli przejdziemy do głównego katalogu projektu i uruchomimy tam IEx za pomocą komendy ies -S mix, możemy pracować ze wszystkimi podprojektami bez najmniejszych przeszkód.
Dla prostego przykładu możemy zmienić zwartość pliku 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
:okCaught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!