Перейти до основного вмісту

Mix в Elixir

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

Коментарі

Популярні публікації

Шпаргалка по базових командах PostgreSQL

1. Підключення до PostgreSQL через командний рядок: psql -h <host> -p <port> -U <username> -d <database> 2. Підключення до бази без параметрів (якщо користувач і база мають однакове ім’я): psql 3. Показати список усіх баз даних: \l 4. Підключитися до іншої бази даних: \c <database_name> 5. Показати список таблиць у поточній базі: \dt 6. Показати всі об'єкти (таблиці, індекси, секвенції): \d 7. Показати таблиці з усіх схем: \dt *.* 8. Переглянути структуру конкретної таблиці: \d <table_name> 9. Виконати SQL-запит (приклад): SELECT * FROM users; 10. Вийти з psql: \q 11. Створити нову базу даних: CREATE DATABASE mydb; 12. Створити нову таблицю: CREATE TABLE users ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE ); 13. Додати новий запис: INSERT INTO users (name, email) VALUES ('Іван', 'ivan@example.com'); 14. Оновити дані в таблиці: UPDATE users SET name = 'Петро' WH...

Основи GLSL

Що таке GLSL? GLSL (OpenGL Shading Language) – мова програмування шейдерів для OpenGL. Використовується для написання vertex, fragment, geometry та інших шейдерів, що працюють на GPU. Оголошення версії #version 330 core Вказує версію GLSL. Наприклад, 330 core відповідає OpenGL 3.3. Вхідні та вихідні змінні layout(location=0) in vec3 aPos; layout(location=1) in vec3 aNormal; out vec3 FragPos; in – вхідні атрибути (vertex shader). out – вихідні змінні (vertex shader) або фінальний колір (fragment shader). Основні типи даних float, int, bool vec2, vec3, vec4 mat2, mat3, mat4 sampler2D (текстури) Тип Опис Приклади використання vec2 Двокомпонентний вектор з типом float. - Текстурні координати (UV) - 2D позиції - Швидкість у 2D vec3 Трикомпонентний вектор з типом float. - Координати позицій у 3D - Нормалі - Колір у форматі RGB vec4 Чотирикомпо...

Атоми в мові програмування Elixir

Атоми в Elixir Атоми є фундаментальною концепцією в Elixir , що відіграє ключову роль у створенні надійних та масштабованих систем. В Elixir це специфічний тип даних, який є константою , незмінною , ідентифікованою за своїм ім'ям . Отже, атом в Elixir — це іменована константа, що представляє себе. Уявіть, що ви даєте унікальне ім'я певній речі, і це ім'я завжди посилається саме на цю річ, і ніколи на щось інше. Наприклад, атом :ok завжди буде означати саме успішне завершення операції, а не якесь інше значення. Технічно, атоми є похідними від чисел . Кожен унікальний атом зберігається у таблиці атомів, і йому присвоюється унікальний цілочисельний ідентифікатор. Це робить їх надзвичайно ефективними для порівняння: замість порівняння рядків (що є повільною операцією), Elixir порівнює цілочисельні ідентифікатори. Переваги та особливості використання атомів Переваги атомів: Ефективність. Завдяки своєму числовому представленню, порівняння атомів є дуже швидким. Це осо...

Встановлення PostgreSQL на Ubuntu-сервер

Встановлення Оновлюємо пакети та встановлюємо PostgreSQL: sudo apt update sudo apt install -y postgresql postgresql-contrib Перевіряємо статус сервісу: sudo systemctl status postgresql Якщо PostgreSQL не запущений, запустимо його: sudo systemctl start postgresql sudo systemctl enable postgresql Налаштування безпеки Зміна пароля: sudo -u postgres psql У консолі PostgreSQL: ALTER USER postgres PASSWORD 'міцний_пароль'; \q \q - вихід з консолі. Список основних команд для роботи з PostgreSQL можна переглянути за посиланням. За замовчуванням PostgreSQL слухає localhost (127.0.0.1). Щоб дозволити доступ із зовнішніх машин, редагуємо конфігурацію: sudo nano /etc/postgresql/17/main/postgresql.conf (замість 17 вкажи версію PostgreSQL, яку встановлено) Шукаємо рядок: #listen_addresses = 'localhost' та замінюємо на listen_addresses = '*' Зберігаємо (Ctrl + X, Y, Enter). Тепер редагуємо pg_hba.conf: sudo nano /etc/postgresql/17/main/pg_hba.conf...

Прості типи даних в Elixir

Мова Elixir має низку простих (примітивних) типів даних, які часто використовуються в повсякденному програмуванні. Числа Elixir підтримує цілі (integer) та дійсні числа (float). # Цілі числа a = 42 b = -7 # Дійсні числа c = 3.14 d = -0.001 Булеві значення Elixir має два булевих значення: true та false . x = true y = false z = x and y # false Атоми Атоми — це константи з іменем, що починається з двокрапки. Вони широко використовуються, наприклад, для імен параметрів або станів. :ok :error :running :elixir_is_fun Рядки Рядки в Elixir — це двійкові дані з кодуванням UTF-8, оголошуються в подвійних лапках. name = "Pavlo" greeting = "Привіт, #{name}!" Nil Nil — це спеціальне значення, що позначає "відсутність значення". value = nil is_nil(value) # true Бінарні дані та байти Бінарні дані оголошуються в подвійних лапках або як бінарні літерали. string = "Привіт" # це рядок, але також бінарні дані binary = ...