Zależności w Elixirze, czyli wstęp do Mixa
Jakoś tak w ostatnich latach się porobiło, że każdy szanujący się język programowania powinien się dorobić narzędzia do zarządzania procesem kompilacji, zależnościami, czy wdrożeniem. Dla Javy jest to Ant, Maven i Gradle. Pierwsze dwa reprezentują podejście opisowe, a trzeci to po prostu DSL w groovym. Dla Scali będzie to SBT, dla Rubiego Rake itd, itp. Można jednak zaobserwować, że wszystkie te narzędzia dążą do modelu, w którym zamiast opisu i konfiguracji (w xml-u) mamy wykonywalny skrypt. Jest to rozsądne, ponieważ daje programiście znacznie większe możliwości w zakresie kontroli procesu kompilacja-testy-wdrożenie niż w przypadku narzędzi w rodzaju mavena. Tu po prostu piszesz kawałek kodu i po problemie.
W przypadku Elixira narzędziem tym jest Mix. Dostarczany jest wraz z paczką języka i pracuje w oparciu o plik mix.exs, w którym zdefiniowany jest najzwyczajniejszy w świecie moduł. Musi on zawierać funkcję project zwracającą listę asocjacyjną (oryginalna nazwa tej struktury to keywords) z konfiguracją oraz używać (makro use) Mix.Project. Na przykładzie:
Listing 1. Przykładowy plik mix.exs
defmodule ElixirExample.Mixfile do
use Mix.Project
def project do
[app: :elixir_example,
version: "0.1.0",
elixir: "~> 1.3",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
deps: deps()]
end
# Configuration for the OTP application
#
# Type "mix help compile.app" for more information
def application do
[applications: [:logger]]
end
# Dependencies can be Hex packages:
#
# {:mydep, "~> 0.3.0"}
#
# Or git/path repositories:
#
# {:mydep, git: "https://github.com/elixir-lang/mydep.git", tag: "0.1.0"}
#
# Type "mix help deps" for more examples and options
defp deps do
[]
end
end
Listing 1. zawiera plik, który powstaje po wywołaniu polecenia mix new. Jak widać jest w nim kilka dodatkowych rzeczy. Po pierwsze lista zależności została przesunięta do prywatnej funkcji deps. Jest to o tyle wygodne, że w przypadku większych aplikacji, gdzie lista zależności jest długa, kod będzie czytelniejszy. Ciekawostką jest możliwość wykorzystania zarówno repozytorium binarek Hex jak i wskazanie taga w repozytorium z kodem źródłowym (git). Po drugie mamy tu funkcję application, która odpowiada za wygenerowanie pliku .app, który opisuje z jakich zasobów korzysta aplikacja, jaka jest jej struktura i jak powinna zostać uruchomiona. Jest to element pochodzący bezpośrednio z erlanga.
I to są podstawy, które pozwalają nam na rozpoczęcie zabawy z programowaniem w Elixirze trochę bardziej skomplikowanych rzeczy niż proste zabawki z użyciem REPLa iex.