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 .formatter.exs
* creating .gitignore
* 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.MixProject 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:

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!