Как использовать Makefile для автоматизации рутинных задач в Python-проекте

Ответ

Makefile — это файл, который содержит набор директив для утилиты make. Хотя make исторически использовался для компиляции программ на C/C++, он является мощным инструментом для автоматизации любых повторяющихся команд в проекте, в том числе и на Python.

Он позволяет стандартизировать команды для всей команды разработчиков.

Типичные задачи для автоматизации:

  • Установка зависимостей: make install
  • Запуск тестов: make test
  • Линтинг и форматирование кода: make lint
  • Очистка проекта: make clean (удаление .pyc файлов, директорий __pycache__ и т.д.)
  • Сборка и запуск Docker-контейнеров: make docker-build

Пример Makefile для Python-проекта:

# .PHONY объявляет цели, которые не связаны с файлами.
# Это гарантирует, что команда будет выполнена, даже если в проекте
# появится файл с таким же именем (например, 'test').
.PHONY: install test lint clean

# Переменная для удобства
VENV_PYTHON=./venv/bin/python

install:
    # Создание виртуального окружения и установка зависимостей
    python3 -m venv venv
    $(VENV_PYTHON) -m pip install --upgrade pip
    $(VENV_PYTHON) -m pip install -r requirements.txt

test:
    # Запуск тестов с помощью pytest
    $(VENV_PYTHON) -m pytest -v

lint:
    # Проверка стиля кода с помощью flake8 и форматирование с black
    $(VENV_PYTHON) -m flake8 .
    $(VENV_PYTHON) -m black .

clean:
    # Удаление временных файлов и директорий
    find . -type f -name '*.pyc' -delete
    find . -type d -name '__pycache__' -delete
    rm -rf .pytest_cache venv

Преимущества:

  • Простота: Легко читаемый синтаксис для простых задач.
  • Стандартизация: Единый интерфейс для выполнения ключевых операций в проекте.
  • Распространенность: Утилита make установлена по умолчанию в большинстве Unix-подобных систем.

Альтернативы и недостатки:

  • Синтаксис: Для сложных сценариев синтаксис Makefile может стать громоздким.
  • Windows: Требует дополнительной настройки для работы в Windows (например, через WSL или make для Windows).
  • Python-специфичные инструменты: Для управления зависимостями и задачами существуют нативные инструменты, такие как Poetry, PDM или библиотеки для автоматизации вроде Invoke.