Как использовать 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.

Ответ 18+ 🔞

А, Makefile, ёпта! Ну это ж классика, блядь, как Тургенев с его Муму, только для кода! Представь себе — старый, бородатый утилит make, который изначально для Сишников придумали, а он взял и впилился во все проекты, как родной, сука. Потому что удобно, блядь!

Вот смотри, зачем это всё: чтобы не пиздовать каждый раз в терминале одни и те же команды, которые длиннее китайских свитков. Вместо этого пишешь в файлике простые правила, и вся команда, даже тот стажёр, который только вчера узнал, что Питон — это не змея, может одной командой всё запустить. Гениально и просто, как тапок!

Что обычно там автоматизируют, чтобы не сойти с ума:

  • Поставить зависимости: make install — и не надо вспоминать, как там pip склоняется.
  • Гонять тесты: make test — и пусть эти тесты сами себя ебут.
  • Причёсывать код: make lint — чтобы твой код не выглядел как пиздец после вчерашнего.
  • Убрать за собой: make clean — вымести все эти __pycache__ и .pyc файлы, которые плодятся как тараканы.
  • С Docker'ом возиться: make docker-build — и не париться с этими длинными, блядь, командами, от которых глаза на лоб лезут.

Вот тебе пример такого Makefile'а, смотри, не обосрись от простоты:

# .PHONY — это магические слова, которые говорят: "эй, make, это не файлы, а команды, выполняй их всегда, даже если вдруг в папке появится файл с именем 'test'!"
.PHONY: install test lint clean

# Переменная для удобства, чтобы не писать каждый раз 'venv/bin/python', а то запыхаешься
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. Флаг -v — чтобы было красиво и подробно, как в хорошем отчете.
    $(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 уже стоит на всех нормальных системах (ну, на юниксоподобных точно).

Но и подводные камни, куда ж без них, сука:

  • Синтаксис: Если задачи становятся сложными, Makefile превращается в головоломку, которую не разгадать без бутылки.
  • Винда: Тут, блядь, отдельная история. Нужно или WSL ставить, или специальную версию make искать. Короче, геморрой.
  • Есть же и другие игрушки: Для Питона есть свои, нативные инструменты вроде Poetry или Invoke, которые могут быть удобнее для каких-то специфичных вещей. Но Makefile — это как универсальный швейцарский нож, простой и проверенный, ёпта!

Короче, если хочешь быстро навести порядок в рутине — бери Makefile, не прогадаешь. А если проект вырастет в овердохуище — тогда уже смотришь на другие варианты.