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

Mix

До того як ми почнемо заглиблюватися в специфіку Elixir, спочатку потрібно вивчити Mix. Якщо ви знайомі з Ruby, то цей інструмент дуже схожий на Bundler, RubyGems і Rake, разом узяті. Це ключова частина будь-якого Elixir проекту. У цьому уроці ми відкриємо для себе лише деякі його можливості. Для отримання повного списку можливостей Mix в поточному середовищі є команда mix help.

До цього ми працювали тільки з iex, у якого є обмеження Для побудови чогось більшого потрібно розділити код на файли і ефективно ними управляти, що mix і дозволяє робити за допомогою проектів.

Створення проекту

Коли ми готові створити новий Elixir проект, mix дозволяє це швидко зробити за допомогою команди mix new. Вона згенерує структуру папок проекту і необхідні файли. Це просто, так що давайте почнемо:

mix new example

З виводу цієї команди видно, що mix створив папку і кілька файлів проекту:

* 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

У цьому уроці ми зосередимося на mix.exs. Тут ми налаштовуємо додаток, залежності, оточення і версію. Відкривши файл, можна побачити щось подібне (коментарі прибрані для спрощення):

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

Перший розділ тут - project. У ньому ми визначаємо ім’я застосунку (app), версію програми (version), версію мови Elixir (elixir), і всі зовнішні залежності (deps).

Розділ application використовується при генерації файлу програми, яку ми розглянемо нижче.

Інтерактивний режим

Можливо, знадобиться використовувати iex з контексту програми. На щастя, mix дозволяє це зробити досить просто.

cd example
iex -S mix

Такий варіант запуску iex завантажить додаток і всі його залежності в поточну сесію.

Компіляція

Mix - досить розумний інструмент і буде перекомпілювати зміни тільки коли потрібно, але іноді може знадобитися скомпілювати весь проект. У цьому розділі ми розглянемо як скомпілювати проект і що робить компіляція.

Для компіляції mix проекту досить запустити команду mix compile в папці проекту: Зауваження: Mix завдання для проекту доступні лише з кореневої папки проекту, в іншому випадку доступні лише глобальні Mix завдання.

mix compile

Зараз проект майже порожній, тому вивід команди буде коротким, але вона закінчиться успішно:

Compiled lib/example.ex
Generated example app

Коли ми компілюємо проект, mix створює папку _build з результатом збірки. Якщо туди зазирнути зараз, то там буде файл з скомпільований проектом example.app.

Управління залежностями

Так як у нашого проекту поки немає залежностей, давайте їх додамо.

Для підключення нової залежності спочатку варто її додати в mix.exs в розділdeps. Список залежностей являє собою кортеж з двома обов’язковими значеннями і одним опціональним: назва пакета у вигляді атома, рядок версії і необов’язкові опції.

Для прикладу можна розглянути проект з залежностями, наприклад 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

Як можна здогадатися, залежність cowboy потрібна тільки в середовищах розробки (dev) і тестування (test).

Як тільки залежності визначені, їх потрібно отримати. Це аналог команди bundle install:

mix deps.get

От і все! Ми визначили і отримали залежності проекту. Тепер має бути зрозуміло, як додати залежності в проект.

Оточення

Mix, як і Bundler, підтримує різні оточення. “З коробки” mix конфігурується з трьома оточеннями:

Поточне оточення можна отримати за допомогою Mix.env. При запуску будь-якої команди його можна задати за допомогою змінної оточення MIX_ENV:

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