Интеграция requirements.txt и install_requires в setuptools
Быстрый ответ
Для упрощения синхронизации содержимого requirements.txt
и setup.py
, примените следующий код:
from setuptools import setup
# Чтение requirements.txt и подготовка списка зависимостей
with open('requirements.txt') as f:
requirements = f.read().splitlines()
setup(
...
install_requires=requirements,
...
)
С применением данного подхода, install_requires
будет включать все пакеты, указанные в requirements.txt
.
Синхронизация setup.py и requirements.txt
Данный метод прост и экономит время, но для идеальной упаковки вашего приложения важно понимать взаимосвязь setup.py
и requirements.txt
. Считайте, что setup.py
— это холодильник, где хранятся "гибкие" зависимости, а requirements.txt
— это точный список покупок.
Гибкие зависимости в setup.py
В setup.py
обычно оставляется некоторое пространство для выбора версий, чтобы обеспечивать стабильное функционирование приложения:
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
:
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
:
dependency_links=[
'git+https://repo.com/package.git#egg=package-1.0'
]
Обеспечьте корректную обработку таких зависимостей в скрипте установки.
Визуализация
setup.py
использует requirements.txt
как рецептуру или кулинарную книгу для сборки пакета:
**Кулинарная книга (requirements.txt):**
– Django==3.0.5
– Requests==2.23.0
– Numpy==1.18.2
Так setup.py
руководствуется этой кулинарной книгой:
setup(
...
install_requires=[
line.strip() for line in open("requirements.txt").readlines()
],
...
)
Эффективная разработка и развертывание
При управлении зависимостями в Python важно различать абстрактные и конкретные зависимости.
Советы для удобства работы
- В
setup.py
объявляйте абстрактные зависимости, оставляя возможность для обновлений. - В
requirements.txt
фиксируйте версии для гарантированной воспроизводимости. - Сегментируйте зависимости по средам (разработка, тестирование, продакшн).
- Будьте готовыми к кардинальным изменениям, контролируйте версии зависимостей.
- Тщательно тестируйте и регулярно проверяйте соответствие
requirements.txt
иsetup.py
.