Fork me on GitHub

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 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.0.1",
     elixir: "~> 1.0",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps]
  end

  def application do
    [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 работает с тремя окружениями:

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

$ MIX_ENV=prod mix compile

Поделиться