Součástí instalace programovacího jazyka Elixir je i nástroj Mix - švýcarský nožík každého alchymisty. Lze ho použít ke všem základním úkonům potřebným během vývoje aplikací, dokonce je možné si do něj nové operace přidávat. Seznam všech dostupných příkazů získáte pomocí jednoduchého mix help, nápovědu ke konkrétní operaci pak pomocí mix help příkaz.

Založení a struktura projektu

Jedna z nejzákladnějších operací je založení nového projektu: mix new moje_knihovna. Příkaz vytvoří nový adresář moje_knihovna a v něm několik souborů a podadresářů:

$ cd moje_knihovna && tree -a
.
├── .formatter.exs
├── .gitignore
├── lib
│   └── moje_knihovna.ex
├── mix.exs
├── README.md
└── test
    ├── moje_knihovna_test.exs
    └── test_helper.exs

Pojďme si jednotlivé soubory stručně představit. Soubor README.md by měl obsahovat popis projektu v markdownu. Pokud budete pro správu verzí používat git, určitě potěší i předgenerovaný .gitignore - schová před gitem vše, co obvykle během vývoje elixirové nástroje vygenerují a co by se nemělo do gitového repozitáře dostat. Soubor .formatter.exs pak obsahuje konfiguraci formátovače zdrojových souborů (lze spustit pomocí mix format).

Velice důležitý je soubor mix.exs, ve kterém je konfigurace projektu. Projekt se konfiguruje přímo v Elixiru (jedná se o skript, jak napovídá přípona .exs). Mimo jiné obsahuje i funkci deps, kde se definují závislosti, tedy knihovny, které váš projekt potřebuje ke své činnosti.

Zbývají dva adresáře: lib - ten obsahuje zdrojáky vašeho projektu a test - ten samozřejmě obsahuje testy.

Spouštění testů

Projekt máme připravený, je správný čas ho otestovat:

$ mix test
Compiling 1 file (.ex)
Generated moje_knihovna app
..

Finished in 0.02 seconds
1 doctest, 1 test, 0 failures

Testy dopadly dobře! Při pohledu do souboru test/moje_knihovna_test.exs vás může zarazit, že proběhly dva testy (1 doctest, 1 test), ačkoliv soubor obsahuje pouze jeden test:

defmodule MojeKnihovnaTest do
  use ExUnit.Case
  doctest MojeKnihovna

  test "greets the world" do
    assert MojeKnihovna.hello() == :world
  end
end

Klíčem k záhadě je doctest MojeKnihovna na řádku 3 - spuštění testů dokumentace. V Elixiru lze totiž testovat i dokumentaci a tudíž mít jistotu, že příklady v ní uvedené jsou stále funkční:

defmodule MojeKnihovna do
  @doc """
  Hello world.

  ## Examples

      iex> MojeKnihovna.hello()
      :world

  """
  def hello do
    :world
  end
end