Do you want to pick up from where you left of?
Take me there

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!