← Назад к вопросам
Всегда ли нужно указывать версии в requirements.txt
1.6 Junior🔥 121 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Версии в requirements.txt: когда и зачем указывать
Этот вопрос касается reproducibility, совместимости и best practices управления зависимостями.
Короткий ответ
Да, версии нужно указывать — но по-разному в зависимости от типа проекта.
1. Почему версии важны
Проблема: Без версий
requirements.txt без версий:
Django
requests
celery
psycopg2
Проблемы:
- На разных машинах установятся разные версии
- Разработчик: Django 4.2, продакшн: Django 5.0
- Код который работает локально ломается на сервере
- Невозможно воспроизвести ошибку
- Production ломается неожиданно после pip install
2. Типы указания версий
Вариант 1: Точная версия (pin)
Django==4.2.5
requests==2.31.0
celery==5.3.1
Плюсы:
- Абсолютная reproducibility
- Никаких сюрпризов
Минусы:
- Можем пропустить патчи с исправлениями
- Django 4.2.5 может иметь баг, а 4.2.6 его исправляет
- Нужно вручную обновлять
Вариант 2: Минимальная версия
Django>=4.2.0
requests>=2.31.0
celery>=5.3.0
Плюсы:
- Получаем исправления
Минусы:
- Может установиться Django 5.0 с breaking changes
- Непредсказуемо
Вариант 3: Диапазон (рекомендуется)
Django>=4.2,<5.0 # 4.2.x но не 5.0
requests>=2.31,<3.0 # 2.x но не 3.0
celery>=5.3,<6.0 # 5.x но не 6.0
Плюсы:
- Получаем патчи (4.2.5 → 4.2.6)
- Избегаем breaking changes (4.2.x не станет 5.0)
- Разумный компромисс
3. Best practice по проектам
Library (опубликованный пакет)
setup.py:
install_requires=[
'requests>=2.20,<3.0',
'click>=7.0,<9.0',
]
Почему: Библиотека используется в других проектах. Слишком строгие версии ломают совместимость.
Application (веб-приложение)
requirements.txt:
Django==4.2.5
DjangoRestFramework==3.14.0
celery==5.3.1
psycopg2-binary==2.9.7
Почему: Нужна reproducibility. Точные версии гарантируют что prod = dev.
Production (с pip freeze)
# После тестирования в dev, создаём lock файл
pip freeze > requirements-lock.txt
# requirements-lock.txt
Django==4.2.5
DjangoRestFramework==3.14.0
celery==5.3.1
click==8.1.0
kombu==5.3.2
urllib3==2.0.6
prompt-toolkit==3.0.40
# ... все транзитивные зависимости
Использование:
pip install -r requirements-lock.txt # 100% reproducible
4. Modern approach: Poetry
# pyproject.toml
[tool.poetry.dependencies]
python = "^3.10"
Django = "^4.2"
requests = "^2.31"
celery = "^5.3"
# poetry.lock (автоматический)
Django 4.2.5
requests 2.31.0
celery 5.3.1
Преимущества:
- pyproject.toml (понятные версии)
- poetry.lock (reproducibility)
- Автоматическое управление
5. Реальные примеры
Ошибка: Без версий
# Разработчик (June 2024):
$ pip install -r requirements.txt
Django 5.0 установлена <- Новая мажорная версия
# Production (June 2024):
$ pip install -r requirements.txt
Django 4.2 установлена <- Старая версия, но code рассчитан на 5.0
# Код ломается на продакшене!
Правильно: С диапазонами
Django>=4.2,<5.0
requests>=2.31,<3.0
# Разработчик (June 2024):
$ pip install -r requirements.txt
Django 4.2.5 установлена
# Production (June 2024):
$ pip install -r requirements.txt
Django 4.2.5 установлена <- Совпадает!
6. Когда обновлять версии
# Workflow обновления
# 1. Разработка (loose версии)
dev-requirements.txt:
Django>=4.2,<5.0
# 2. Testing (фиксируем что работает)
$ pip freeze > tested-versions.txt
# Django==4.2.8
# 3. Deployment (используем tested-versions)
$ pip install -r tested-versions.txt
# 4. Обновление (планируемое)
# Раз в месяц:
$ pip install --upgrade Django
$ python manage.py test
$ pip freeze > tested-versions.txt
# Если всё работает - обновляем production
7. Anti-patterns
❌ Неправильно: Версии везде
django-cors-headers==4.0.0
django-extensions==3.2.3
django-environ==0.11.2
django-filter==23.3
django-health-check==3.16.7
django-import-export==3.3.0
django-model-utils==4.3.1
django-mysql==4.0.2
django-nested-admin==3.5.1
django-rest-auth==0.9.5
django-rest-framework==3.14.0
django-split-settings==1.2.3
django-stubs==4.2.3
django-storages==1.14.2
django-tables2==2.6.0
Проблема: Сложно обновлять, заморозить транзитивные зависимости.
✅ Правильно: С диапазонами
Django>=4.2,<5.0
DjangoRestFramework>=3.14,<4.0
celery>=5.3,<6.0
psycopg2-binary>=2.9,<3.0
Плюс: poetry.lock для точности.
8. Чеклист
- Все зависимости имеют версии? (минимум диапазон)
- Используется lock файл в продакшене?
- Есть workflow обновления зависимостей?
- Тестируются ли новые версии перед deployment?
- Dev и Prod используют одни версии?
- Версионирование соответствует типу проекта (lib vs app)?
Резюме
Да, версии нужны!
Для library:
install_requires=['django>=4.2,<5.0']
Для application:
django==4.2.8
poetry.lock для воспроизводимости
Правило:
- Library: гибкие диапазоны (>=, <)
- Application: точные версии (== или lock)
- Production: lock файлы обязательны