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.