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