Mix — це потужний інструмент для управління проектами Elixir. Він надає команди для створення проектів, управління залежностями, компіляції коду, запуску тестів та багато іншого.
Mix — це менеджер завдань та збирач проектів, подібний до Maven (Java) або Cargo (Rust). Він поставляється зі встановленням Elixir:
# Перевірка версії Mix
mix --version
# Mix 1.14.0 (compiled with Erlang/OTP 25)
# Допомога
mix help
mix help test
mix help compile
Створення нового проекту
Mix допомагає швидко створити новий проект з необхідною структурою:
# Створення простого проекту
mix new my_app
# Creates my_app directory with files
# Створення проекту як OTP додатка
mix new my_app --sup
# Додає supervision tree
# Створення проекту для бібліотеки
mix new my_lib --umbrella
# Створює monorepo структуру
Структура проекту
my_app/
├── _build/ # Скомпільовані файли
├── lib/ # Сирцевий код
│ ├── my_app.ex # Основний модуль
│ └── my_app/ # Додаткові модулі
├── test/ # Тести
│ ├── test_helper.exs
│ └── my_app_test.exs
├── .formatter.exs # Конфігурація форматування
├── .gitignore
├── mix.exs # Конфігурація проекту
├── mix.lock # Заблоковані версії залежностей
├── README.md
└── LICENSE
Файл mix.exs
Основний файл конфігурації проекту з налаштуваннями та залежностями:
defmodule MyApp.MixProject do
use Mix.Project
def project do
[
app: :my_app, # Ім'я додатка
version: "0.1.0", # Версія
elixir: "~> 1.14", # Мінімальна версія Elixir
start_permanent: Mix.env() == :prod,
deps: deps(),
# Налаштування тестування
test_coverage: [tool: ExCoveralls],
# Налаштування документації
docs: [
main: "MyApp",
extras: ["README.md"]
]
]
end
# Запуск застосунка
def application do
[
extra_applications: [:logger],
mod: {MyApp.Application, []}
]
end
# Залежності
defp deps do
[
# {:dep_name, "~> 1.0"}
]
end
end
Управління залежностями
Залежності вказуються в функції deps файлу mix.exs:
defp deps do
[
# Від Hex (пакетний менеджер)
{:phoenix, "~> 1.7.0"},
{:ecto_sql, "~> 3.9"},
{:postgrex, "~> 0.17"},
# З GitHub
{:my_lib, github: "user/my_lib"},
{:my_lib, github: "user/my_lib", branch: "main"},
{:my_lib, github: "user/my_lib", tag: "v1.0.0"},
# З локального шляху
{:my_lib, path: "../my_lib"},
# Для розробки
{:ex_doc, "~> 0.29", only: :dev},
{:credo, "~> 1.7", only: [:dev, :test]},
# Для тестування
{:mox, "~> 1.0", only: :test},
{:ex_machina, "~> 2.7", only: :test},
# Переконданням версій
{:plug, ">= 1.5.0 and ≶ 1.15.0"}
]
end
# Після зміни deps
mix deps.get # Завантажити залежності
mix deps.update all # Оновити всі
mix deps.lock # Оновити mix.lock
mix deps.tree # Показати дерево залежностей
Основні команди Mix
| Команда | Опис |
|---|---|
| mix compile | Компіляція коду |
| mix test | Запуск тестів |
| mix run | Запуск коду |
| mix iex | Запуск IEx з проектом |
| mix format | Форматування коду |
| mix docs | Генерація документації |
| mix ecto.create | Створення БД |
| mix release | Створення release |
Компіляція та запуск
# Компіляція
mix compile
# Генерує файли у _build/
# Компіляція з силою
mix compile --force
# Перекомпілює все
# Запуск скрипта
mix run lib/my_app.ex
mix run -e "IO.puts('Hello')"
# IEx з завантаженим проектом
mix iex
iex(1)> MyApp.hello()
# Запуск в умовах production
MIX_ENV=prod mix compile
MIX_ENV=prod mix test
Тестування
# Запуск всіх тестів
mix test
# Запуск конкретного файла
mix test test/my_app_test.exs
# Запуск конкретного тесту по імені
mix test --only tag:slow
# Показати покриття кодом
mix test --cover
# Спостереження за змінами (потребує hex пакета)
mix test.watch
# Запуск з виводом покриття
mix coveralls
Обліковий запис та публікація
# Реєстрація на Hex
mix hex.user register
# Публікація пакета
mix hex.publish
# Перевірка перед публікацією
mix hex.publish --dry-run
# Отримання информації про пакет
mix hex.info phoenix
# Встановлення Hex API ключа
mix hex.user auth
Налаштування оточень
Mix підтримує різні оточення з різними налаштуваннями:
# Задання оточення
MIX_ENV=dev mix compile # розробка (default)
MIX_ENV=test mix test # тестування
MIX_ENV=prod mix compile # продакшн
# Перевірка в коді
if Mix.env() == :prod do
IO.puts("Production mode")
end
# Конфігурація per-environment
# config/dev.exs
config :my_app, MyApp.Repo,
username: "postgres",
password: "postgres",
database: "my_app_dev"
# config/test.exs
config :my_app, MyApp.Repo,
username: "postgres",
password: "postgres",
database: "my_app_test",
pool: Ecto.Adapters.SQL.Sandbox
# config/prod.exs
config :my_app, MyApp.Repo,
database: System.get_env("DB_NAME")
pool_size: 20
Користувацькі таски
Можна створювати власні Mix таски:
# lib/mix/tasks/hello.ex
defmodule Mix.Tasks.Hello do
use Mix.Task
@shortdoc "Привіт світу!"
def run(args) do
name = List.first(args) || "World"
IO.puts("Hello, #{name}!")
end
end
# Запуск
mix hello
# Hello, World!
mix hello Elixir
# Hello, Elixir!
# Список усіх доступних тасків
mix help
Форматування коду
# Форматування всіх файлів
mix format
# Перевірка без змін
mix format --check-formatted
# Форматування конкретних файлів
mix format lib/my_app.ex
# Налаштування в .formatter.exs
[
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"],
plugins: [Phoenix.LiveView.HTMLFormatter],
line_length: 100
]
Документація та аналіз
# Генерація документації (потребує ex_doc)
mix docs
# Відкриває doc/index.html
# Статичний аналіз коду (потребує Credo)
mix credo
mix credo strict
mix credo suggest --all
# Перевірка типів (потребує Dialyzer)
mix dialyzer
# Моніторинг покриття тестами
mix coveralls
mix coveralls.detail
Профілювання та оптимізація
# Профілювання часу компіляції
mix profile.ex
# Запуск з elog'ом (потребує встановлення)
mix escript.build
./my_app
# Аналіз залежностей
mix xref unreachable # Недосяжний код
mix xref deprecated # Застарілі функції
mix xref callers Mod # Хто викликає Mod
Коментарі
Дописати коментар