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 конфігурується з трьома оточеннями:
-
: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 lesson on GitHub!