Как управлять зависимостями в проекте на Python

Ответ

Управление зависимостями в Python обеспечивает воспроизводимость окружения и предотвращает конфликты версий. Существует несколько подходов:

  1. requirements.txt (стандартный подход) Простой текстовый файл, перечисляющий пакеты. Создается командой pip freeze > requirements.txt.

    • Плюсы: Простота, поддерживается всеми инструментами.
    • Минусы: Не разделяет основные и dev-зависимости, не гарантирует детерминированную установку (установка requests>=2.25.0 сегодня и через год может дать разные результаты).
    # requirements.txt
    flask==2.0.1
    requests>=2.25.0
  2. Pipenv (улучшенный подход) Сочетает управление пакетами (Pipfile) и виртуальными окружениями. Создает Pipfile.lock для фиксации точных версий всех зависимостей, обеспечивая детерминированные сборки.

    • Плюсы: Автоматическое управление virtualenv, lock-файл.
    • Минусы: Может быть медленнее других инструментов.
    # Установить основную зависимость
    pipenv install flask
    
    # Установить dev-зависимость
    pipenv install --dev pytest
  3. Poetry (современный стандарт) Мощный инструмент, использующий pyproject.toml для метаданных проекта и зависимостей. Генерирует poetry.lock для строгой фиксации версий.

    • Плюсы: Надежное разрешение зависимостей, удобное управление проектом и публикация пакетов, разделение зависимостей.
    • Минусы: Более высокий порог входа для новичков.
    # Добавить основную зависимость
    poetry add flask
    
    # Добавить dev-зависимость
    poetry add --dev pytest

Рекомендации:

  • Для новых проектов: Используйте Poetry как наиболее надежный и функциональный инструмент.
  • Для legacy или простых скриптов: Достаточно requirements.txt, но обязательно фиксируйте версии с помощью pip freeze.
  • Ключевая практика: Всегда используйте lock-файлы (poetry.lock, Pipfile.lock) или requirements.txt с зафиксированными версиями (==) для обеспечения воспроизводимости сборок в CI/CD и на машинах других разработчиков.

Ответ 18+ 🔞

Слушай, а вот эта вся хуйня с зависимостями в питоне — это же просто пиздец какой-то цирк с конями, если честно. Сидишь такой, пишешь код, всё летает, а потом бац — коллега клонирует репу, и у него всё в говне. А почему? Потому что ты, мудак, не зафиксировал версию какой-нибудь библиотеки, а она за месяц обновилась и всё сломала. Вообще пиздец.

Ну ладно, давай по порядку, как с этим безобразием бороться.

1. requirements.txt — старый добрый распиздяйский метод. Просто текстовый файл, куда пишешь, что тебе нужно. Создаёшь командой pip freeze > requirements.txt, и вуаля — там список всего, что у тебя установлено. Но тут, блядь, подвох: если ты написал requests>=2.25.0, то через полгода установится версия 3.0, которая может всё разъебать. А ты потом будешь чесать репу: «Ну оно же у меня работало!».

# requirements.txt
flask==2.0.1  # Вот так, с двумя равенствами — это надёжно, блядь
requests>=2.25.0  # А так — это игра в русскую рулетку, ёпта
  • Плюсы: Проще некуда, все понимают.
  • Минусы: Нет разделения на «для работы» и «для разработки», а версии могут уплыть, и потом охуеешь.

2. Pipenv — как будто умнее, но иногда тормозит как хуй в проруби. Тут уже появляется Pipfile для зависимостей и Pipfile.lock, который фиксирует ВСЁ до последней запятой. Это уже серьёзнее.

# Ставим основную библиотеку
pipenv install flask

# А это только для разработки, например, тесты
pipenv install --dev pytest
  • Плюсы: Сам создаёт виртуальное окружение, есть lock-файл — воспроизводимость на уровне.
  • Минусы: Иногда такой медленный, что хочется ебать его в сраку и вернуться к старому доброму pip.

3. Poetry — сейчас все охуели от него, и не зря. Это, блядь, целый комбайн. Всё в одном файле pyproject.toml — и зависимости, и настройки проекта, и даже как пакет публиковать. И свой poetry.lock генерирует, конечно.

# Добавляем основную зависимость
poetry add flask

# А это — только для разработки
poetry add --dev pytest
  • Плюсы: Очень надёжно решает зависимости, удобно управлять проектом, для публикации пакетов — вообще красота.
  • Минусы: Новичок посмотрит на pyproject.toml и может охуеть, но это дело привычки.

Так что же выбрать, спросишь ты, мудя?

  • Если проект новый и ты не конченый мазохист — бери Poetry. Это сейчас стандарт де-факто для чего-то серьёзного.
  • Если у тебя скрипт на три строки или легаси-проект, который все боятся трогать — хватит и requirements.txt. Но, блядь, обязательно фиксируй версии через pip freeze, чтобы не было сюрпризов!
  • Главное правило, которое выжги себе на жопе: Используй lock-файлы (poetry.lock, Pipfile.lock) или requirements.txt с жёстко зафиксированными версиями (==). Иначе твой CI/CD или коллега соберёт проект, и получится ебаный винегрет, а не рабочее приложение. Всё, вопрос закрыт.