Зачем «пинить» пакеты в requirements.txt
celery
django>=2.0.0
djangorestframework>=3.8.0,<3.9.5
Плохо
celery==4.2.1
django==2.1.4
djangorestframework==3.9.0
Хорошо
Если вы так не делаете, то вы никогда не сможете знать, что у вас будет установлено при следующем деплое
Даже при сборке окружения «с нуля» вы можете получить эти проблемы
Результат pip install
без ==
зависит от:
- того, какие пакеты установлены в данный момент
- того, какие версии пакетов есть в PyPI в данный момент
«Пинить» нужно и ваши непосредственные зависимости, и зависимости зависимостей,
«Пинить» нужно и ваши непосредственные зависимости, и зависимости зависимостей,
и зависимости зависимостей зависимостей…
Минусы «запинивания»
- Вы не получаете обновления используемых библиотек (патчи и новые фичи)
- Файл
requirements.txt
огромен
- Непонятно, какой пакет нужен проекту, а какой — просто зависимость зависимости
- «Запиненная» минорная версия может исчезнуть из PyPi
Workaround для минусов
- Использовать два файла:
requirements.in
содержит зависимости проекта
requirements.txt
содержит «запиненные», все зависимости
- Периодически обновлять «запиненный» файл
- Использовать кеширующие PyPi сервера
celery
django>=2.0.0
djangorestframework>=3.8.0,<3.9.5
Хорошо
( потому что requirements.in )