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 config
* creating config/config.exs
* creating lib
* creating lib/example.ex
* creating test
* creating test/test_helper.exs
* creating test/example_test.exs

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

defmodule Example.Mixfile 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 дозволяє це зробити досить просто.

$ iex -S mix

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

Компіляція

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

Для компіляції mix проекту досить запустити команду mix compile в папці проекту:

$ 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 працює з трьома оточеннями:

  • :dev — Оточення за замовчуванням.
  • :test — Використовується в mix test. Буде розглянуто докладніше в наступному уроці.
  • :prod — Використовується при запуску програми в “бойовому” оточенні.

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

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