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

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:

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.exs

Jeż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 Inspect

IEx

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
:ok
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!