Автоматизация проектов с помощью Makefile: практическое руководство
Автор: Javohir Abdullayev · · Программирование

Зачем разработчикам нужен Makefile?
В любом проекте разработки полно ежедневных повторяющихся команд: активация виртуального окружения, применение миграций, запуск тестов, пересборка Docker-контейнеров, проверка форматирования кода и деплой на сервер. Зачастую эти команды слишком длинные, и каждый раз вводить их вручную или копировать из файла README.md отнимает лишнее время.
Именно для решения этой проблемы Makefile является наиболее удобным и проверенным инструментом. Изначально созданный для компиляции проектов на C/C++, сегодня он широко применяется в Python, Django, Node.js, Go и других современных технологиях для выполнения задач с помощью одной короткой команды.
Базовый синтаксис Makefile
В корневой папке проекта (root directory) создается файл с именем Makefile (без расширения). Его базовая структура крайне проста:
цель: зависимости
командаВажное правило: В начале каждой команды обязательно должен стоять именно один символ TAB, а не пробелы. В противном случае make вернет ошибку.
Полный пример Makefile для проекта на Python и Django
Давайте рассмотрим готовый файл Makefile, который упрощает команды, ежедневно используемые в проекте на Django:
.PHONY: help run migrate test lint format clean
help:
@echo "Доступные команды:"
@echo " make run - Запуск сервера Django"
@echo " make migrate - Применение миграций"
@echo " make test - Запуск тестов через pytest"
@echo " make lint - Проверка качества кода (flake8/ruff)"
@echo " make format - Автоформатирование кода (black/ruff)"
@echo " make clean - Очистка ненужных файлов кэша"
run:
python manage.py runserver 0.0.0.0:8000
migrate:
python manage.py makemigrations
python manage.py migrate
test:
pytest --cov=app --cov-report=term-missing
lint:
ruff check .
format:
ruff format .
clean:
find . -type d -name "__pycache__" -exec rm -rf {} +
find . -type f -name "*.pyc" -deleteЗачем нужна директива .PHONY?
Директива .PHONY используется для того, чтобы Makefile не путал имя цели с именем файла. Например, если в каталоге проекта есть папка или файл с именем test и вы выполните команду make test, утилита Make может посчитать, что файл уже существует, и не выполнить команду. Запись .PHONY: test явно сообщает Make, что это не файл, а именно исполняемая команда.
Использование в связке с Docker
Если в своем проекте вы используете Docker и Docker Compose, команды становятся еще длиннее. Makefile и здесь существенно облегчает работу:
.PHONY: up down build logs shell
up:
docker compose up -d
down:
docker compose down
build:
docker compose up --build -d
logs:
docker compose logs -f web
shell:
docker compose exec web bashТеперь вместо длинной команды docker compose exec web bash достаточно просто ввести make shell. Это не только экономит время, но и значительно ускоряет адаптацию новых разработчиков в команде.
Использование переменных
Объявляя переменные внутри Makefile, можно гибко управлять конфигурацией:
PYTHON = python3
PORT ?= 8000
run:
$(PYTHON) manage.py runserver $(PORT)В этом случае номер порта можно легко переопределить прямо через терминал: make run PORT=9000.
Заключение
Makefile — это мощный инструмент, который не требует установки дополнительных библиотек и готов к работе практически во всех системах Linux и macOS (а на Windows легко устанавливается через Chocolatey или WSL). Добавив один качественный Makefile в каждый свой проект, вы существенно повысите продуктивность как самого себя, так и всей команды.
Теги: #Makefile #Samaradorlik #Terminal #DevOps #Python