Mix

Zanim zajmiemy się bardziej zaawansowanymi aspektami Elixira musimy poznać Mix. Jeżeli znasz język Ruby, to można powiedzieć, że Mix stanowi połączenie Bundlera, RubyGems i Rake. Jest to kluczowy element każdego projektu tworzonego w Elixirze i w tej lekcji przyjrzymy się najważniejszym jego funkcjom. By uzyskać pełną listę oferowanych funkcji, wpisz mix help.

Dotychczas pracowaliśmy z interpreterem iex, który ma dość ograniczone możliwości Chcąc napisać coś bardziej rozbudowanego, musimy nasz kod podzielić na wiele plików, by móc nim efektywnie zarządzać; Mix pozwala nam to robić z projektami.

Nowy projekt

Kiedy jesteśmy gotowi, by stworzyć nasz pierwszy projekt w Elixirze, możemy to zrobić za pomocą polecenia mix new. Generator stworzy strukturę katalogów oraz niezbędne pliki projektu. Jest to bardzo proste – zatem zaczynajmy:

mix new example

W konsoli pojawi się informacja, że Mix stworzył niezbędne pliki oraz katalogi:

* creating README.md
* creating .gitignore
* creating .formatter.exs
* creating mix.exs
* creating lib
* creating lib/example.ex
* creating test
* creating test/test_helper.exs
* creating test/example_test.exs

W tej lekcji skupimy się na pliku mix.exs. Skonfigurujemy naszą aplikację, zależności, środowisko oraz wersję. Otwórz plik w swoim ulubionym edytorze – powinieneś zobaczyć coś takiego (komentarze usunęliśmy dla zwięzłości):

defmodule Example.Mix do
  use Mix.Project

  def project do
    [
      app: :example,
      version: "0.1.0",
      elixir: "~> 1.5",
      start_permanent: Mix.env() == :prod,
      deps: deps()
    ]
  end

  def application do
    [
      extra_applications: [:logger]
    ]
  end

  defp deps do
    []
  end
end

Pierwsza sekcja, której się przyjrzymy, to project. W niej definiujemy nazwę naszej aplikacji (app), określamy jej wersję (version), wersję Elixira (elixir) oraz listę zależności (deps).

Sekcja application jest używana w czasie tworzenia pliku aplikacji, który omówimy dalej.

Tryb interaktywny

Może zajść potrzeba użycia iex w kontekście naszej aplikacji. Dzięki Mixowi jest to na szczęście proste. Wystarczy uruchomić nową sesję iex z parametrami:

cd example
iex -S mix

Tak uruchomiony iex załaduje na starcie aplikację wraz z zależnościami.

Kompilacja

Mix jest cwany i będzie kompilował tylko zmieniony kod, ale czasami zachodzi potrzeba skompilowania całego projektu. W tej części przyjrzymy się jak kompilować projekt i co robi kompilator.

Do skompilowania projektu wystarczy polecenie mix compile wywołane w katalogu głównym projektu: Uwaga: polecenia Mixa specyficzne dla projektu są dostępne jedynie w głównym katalogu tego projektu – w innych lokalizacjach można użyć jedynie poleceń globalnych.

mix compile

Nasz projekt nie zawiera zbyt wielu elementów, a zatem komunikat nie jest zbyt ekscytujący, ale kompilacja powinna zakończyć się powodzeniem:

Compiled lib/example.ex
Generated example app

W trakcie kompilacji Mix tworzy katalog _build, w którym umieści wyniki. Jeśli zajrzymy do katalogu _build, zobaczymy naszą skompilowaną aplikację: example.app.

Zarządzanie zależnościami

Jak na razie nasz projekt nie ma żadnych zależności, ale nic nie stoi na przeszkodzie, by je dodać.

Aby dodać nową zależność, powinniśmy ją najpierw umieścić w sekcji deps pliku mix.exs. Lista zależności zawiera krotki o dwóch obowiązkowych elementach i jednym opcjonalnym: atomie reprezentującym nazwę pakietu, ciągu znaków określającym wersję oraz opcjonalnych przełącznikach.

Spójrzmy dla przykładu na projekt phoenix_slim:

def deps do
  [
    {:phoenix, "~> 1.1 or ~> 1.2"},
    {:phoenix_html, "~> 2.3"},
    {:cowboy, "~> 1.0", only: [:dev, :test]},
    {:slime, "~> 0.14"}
  ]
end

Jak zapewne się domyślasz, zależność cowboy jest potrzebna tylko przy implementowaniu i testowaniu aplikacji.

Kiedy nasze zależności są już skonfigurowane, pozostaje nam jeszcze jeden krok: pobranie ich. Jest to zachowanie analogiczne do bundle install:

mix deps.get

I to wszystko! Zdefiniowaliśmy i pobraliśmy nasze zależności. Teraz możemy ich użyć jak zajdzie potrzeba.

Środowiska

Mix, tak jak Bundler, wspiera rozróżnianie środowisk. Domyślnie mamy zdefiniowane trzy z nich:

Aktualne środowisko dostępne jest w Mix.env. Jak można się spodziewać, istnieje możliwość skonfigurowania go za pomocą zmiennej środowiskowej MIX_ENV:

MIX_ENV=prod mix compile
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!