Как организовать список зависимостей использующихся в проекте?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как организовать список зависимостей используемых в проекте?
Организация зависимостей — критически важная часть управления Python проектом. Вот основные подходы:
1. requirements.txt — традиционный способ
Самый распространённый формат:
# requirements.txt
Django==4.2.0
rest-framework==3.14.0
psycopg2-binary==2.9.6
celery==5.3.1
redis==4.5.4
Python-dotenv==1.0.0
requests==2.31.0
pytest==7.3.1
Получить список установленных пакетов:
pip freeze > requirements.txt
Установить зависимости:
pip install -r requirements.txt
2. Разделение зависимостей по окружениям
Отделяй production от development:
requirements/
├── base.txt # Общие для всех
├── dev.txt # Для разработки
├── prod.txt # Для production
└── test.txt # Для тестирования
requirements/base.txt:
Django==4.2.0
rest-framework==3.14.0
psycopg2-binary==2.9.6
celery==5.3.1
redis==4.5.4
requirements/dev.txt:
-r base.txt
# Инструменты разработки
pytest==7.3.1
pytest-django==4.5.2
pytest-cov==4.1.0
black==23.3.0
flake8==6.0.0
isort==5.12.0
ipython==8.12.0
requirements/prod.txt:
-r base.txt
# Для продакшена
gunicorn==20.1.0
whitenoise==6.4.0
python-decouple==3.8
requirements/test.txt:
-r base.txt
-r dev.txt
faker==18.9.0
factory-boy==3.2.1
responses==0.23.1
Установка для разных окружений:
# Разработка
pip install -r requirements/dev.txt
# Продакшен
pip install -r requirements/prod.txt
# Тестирование
pip install -r requirements/test.txt
3. poetry — современный и рекомендуемый подход
Убирает необходимость вручную обновлять requirements:
# Инициализация
poetry init
# Добавление зависимости
poetry add django
poetry add pytest --group dev
poetry add gunicorn --group prod
pyproject.toml:
[tool.poetry]
name = "my-project"
version = "0.1.0"
description = "My Python project"
[tool.poetry.dependencies]
python = "^3.10"
django = "^4.2"
celery = "^5.3"
psycopg2-binary = "^2.9"
[tool.poetry.group.dev.dependencies]
pytest = "^7.3"
pytest-django = "^4.5"
black = "^23.3"
flake8 = "^6.0"
[tool.poetry.group.prod.dependencies]
gunicorn = "^20.1"
whitenoise = "^6.4"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
Установка:
# Установить все зависимости
poetry install
# Установить без dev зависимостей
poetry install --no-dev
# Установить только prod группу
poetry install --only prod
4. pip-tools — для более строгого контроля версий
Создаёт requirements.txt из requirements.in:
pip install pip-tools
requirements.in:
Django==4.2.0
celery==5.3.1
Генерирование requirements.txt с точными версиями:
pip-compile requirements.in
Результат (requirements.txt) — с зависимостями зависимостей:
#
# This file is autogenerated by pip-compile with Python 3.10
#
Django==4.2.0
# via -r requirements.in
celery==5.3.1
# via -r requirements.in
kombu==5.3.0
# via celery
vinyl==0.2.2
# via kombu
5. Семантическое версионирование (Semantic Versioning)
Как указывать версии пакетов:
# Точная версия
Django==4.2.0
# Минимальная версия
Django>=4.2.0
# Версия с верхней границей
Django<5.0
# Диапазон
Django>=4.2.0,<5.0
# Совместимая версия (~=)
Django~=4.2.0 # Эквивалент >= 4.2.0, < 4.3.0
# Тильда для крупных версий
Django~=4.2 # Эквивалент >= 4.2, < 5.0
# Звездочка (не рекомендуется)
Django==4.* # Любая версия 4.x
6. Организация в pyproject.toml (PEP 517)
Современный стандарт для упаковки:
[project]
name = "my-app"
version = "1.0.0"
description = "My awesome app"
requires-python = ">=3.10"
[project.dependencies]
django = ">=4.2,<5"
celery = "^5.3"
psycopg2-binary = "^2.9"
[project.optional-dependencies]
dev = [
"pytest>=7.3",
"black==23.3.0",
"flake8==6.0",
]
prod = [
"gunicorn>=20.1",
"whitenoise>=6.4",
]
[tool.ruff]
line-length = 100
target-version = "py310"
Установка optional зависимостей:
pip install -e ".[dev]"
pip install -e ".[prod]"
pip install -e ".[dev,prod]"
7. Виртуальные окружения — обязательны
Изолируй зависимости проекта:
# Создание
python -m venv venv
# Активация (Linux/Mac)
source venv/bin/activate
# Активация (Windows)
venv\Scripts\activate
# Проверка
which python # должно показать путь в venv
# Отключение
deactivate
8. Pinning versions (фиксирование версий)
Для воспроизводимости в production:
# requirements.txt с точными версиями
Django==4.2.0
celery==5.3.1
redis==4.5.4
psycopg2-binary==2.9.6
requests==2.31.0
gunicorn==20.1.0
Для разработки можно быть мягче:
Django>=4.2.0,<5.0
celery>=5.3.0,<6.0
9. Проверка устаревших зависимостей
# pip-audit — проверка уязвимостей
pip install pip-audit
pip-audit
# pip-check — проверка совместимости
pip install pip-check
pip-check
# safety — проверка базы уязвимостей
pip install safety
safety check
10. Best Practices организации
# Структура проекта
my_project/
├── requirements/
│ ├── base.txt
│ ├── dev.txt
│ ├── prod.txt
│ └── test.txt
├── pyproject.toml # Или poetry.lock
├── poetry.lock # Если используешь poetry
├── Makefile # Для удобства
├── .gitignore
└── src/
└── my_project/
Makefile для удобства:
.PHONY: install install-dev install-prod
install:
pip install -r requirements/base.txt
install-dev:
pip install -r requirements/dev.txt
install-prod:
pip install -r requirements/prod.txt
freeze:
pip freeze > requirements/base.txt
update:
pip install --upgrade -r requirements/base.txt
Использование:
make install-dev
make freeze
make update
Рекомендации по выбору подхода:
Маленький проект:
- Один requirements.txt
- pip freeze
Средний проект:
- requirements/ папка с разделением (base, dev, prod)
- pip freeze
Большой проект / production:
- Poetry или pyproject.toml
- Точные версии
- Регулярные проверки безопасности
Enterprise решение:
- Poetry с lock файлом
- pip-audit для безопасности
- Автоматизация обновлений (Dependabot)
Итог:
Оргнизация зависимостей важна для:
- Воспроизводимости — одинаковые версии везде
- Безопасности — контроль уязвимостей
- Производительности — правильное окружение
- Разработки — удобство и скорость
Выбирай подход в зависимости от размера проекта, но всегда используй виртуальные окружения и версионируй зависимости.