Интеграция requirements.txt и install_requires в setuptools

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для упрощения синхронизации содержимого requirements.txt и setup.py, примените следующий код:

Python
Скопировать код
from setuptools import setup

# Чтение requirements.txt и подготовка списка зависимостей
with open('requirements.txt') as f:
    requirements = f.read().splitlines()

setup(
    ...
    install_requires=requirements,
    ...
)

С применением данного подхода, install_requires будет включать все пакеты, указанные в requirements.txt.

Кинга Идем в IT: пошаговый план для смены профессии

Синхронизация setup.py и requirements.txt

Данный метод прост и экономит время, но для идеальной упаковки вашего приложения важно понимать взаимосвязь setup.py и requirements.txt. Считайте, что setup.py — это холодильник, где хранятся "гибкие" зависимости, а requirements.txt — это точный список покупок.

Гибкие зависимости в setup.py

В setup.py обычно оставляется некоторое пространство для выбора версий, чтобы обеспечивать стабильное функционирование приложения:

Python
Скопировать код
install_requires=[
    'guacamole>=1.0.0,<2.0.0',
    'tacos~=1.4.2',
]

Это лишь иллюстрация; пакеты guacamole и tacos на самом деле не существуют.

Точный список в requirements.txt

В requirements.txt следует строго фиксировать версии для гарантии повторяемости сборок:

Requests==2.23.0
Django==3.0.5
Numpy==1.18.2

Данный файл выполняет роль регулятора, пропускающего только указанные версии.

Управление зависимостями: мастер-класс

Зависимости в проектах иногда могут быть сложными, поэтому важно помнить:

Роль setup.py

setup.py — это основа проекта. В нем описываются только необходимые и совместимые пакеты, без жесткого определения версий.

Значимость requirements.txt

Файл requirements.txt фиксирует конкретные версии пакетов, что обеспечивает устойчивость и контроль при развертывании приложения.

Сложные требования

Для сложных требований можно использовать функции разбора pip для анализа файла requirements.txt:

Python
Скопировать код
from pip._internal.req import parse_requirements

install_reqs = parse_requirements('requirements.txt', session='hack')
reqs = [str(ir.requirement) for ir in install_reqs]

setup(
    ...
    install_requires=reqs,
    ...
)

Помните, что функционал pip может меняться в зависимости от версии.

URL-зависимости

Для управления зависимостями, указанными через VCS URL, используйте dependency_links:

Python
Скопировать код
dependency_links=[
    'git+https://repo.com/package.git#egg=package-1.0'
]

Обеспечьте корректную обработку таких зависимостей в скрипте установки.

Визуализация

setup.py использует requirements.txt как рецептуру или кулинарную книгу для сборки пакета:

Markdown
Скопировать код
**Кулинарная книга (requirements.txt):**
  – Django==3.0.5
  – Requests==2.23.0
  – Numpy==1.18.2

Так setup.py руководствуется этой кулинарной книгой:

Python
Скопировать код
setup(
    ...
    install_requires=[
        line.strip() for line in open("requirements.txt").readlines()
    ],
    ...
)

Эффективная разработка и развертывание

При управлении зависимостями в Python важно различать абстрактные и конкретные зависимости.

Советы для удобства работы

  • В setup.py объявляйте абстрактные зависимости, оставляя возможность для обновлений.
  • В requirements.txt фиксируйте версии для гарантированной воспроизводимости.
  • Сегментируйте зависимости по средам (разработка, тестирование, продакшн).
  • Будьте готовыми к кардинальным изменениям, контролируйте версии зависимостей.
  • Тщательно тестируйте и регулярно проверяйте соответствие requirements.txt и setup.py.

Полезные материалы