Как разрешение зависимостей работает с pip, когда пакет указывает диапазон, а другой - нет?
У меня есть require.txt только с 2 зависимостями:
sentry-sdk==0.7.11
requests==2.21.0
Я проверил setup.py обоих пакетов, и оба зависят от urllib3:
- запрос предоставляет диапазон, который не принимает 1,25
- sentry-sdk вместо этого не указывает конкретную версию или диапазон
Недавно была выпущена новая версия urllib3 (1.25), когда я устанавливаю зависимости с помощью pip. Я получаю следующую ошибку:
ERROR: requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25 which is incompatible.
Это поведение ожидается или это ошибка в пипсах?
В чем смысл не указывать версию зависимости в install_requires? "заставить последнюю версию"?
1 ответ
Причина, по которой вы наблюдаете это поведение, заключается в том, что pip устанавливает sentry-sdk
первый. Так как для этого нет версии, вы получаете последнюю версию (1.25). когда requests
должна быть установлена, эта версия несовместима.
Единственный способ решить эту проблему - это решить все ограничения версий в глобальном масштабе, чего не может сделать пункт AFAIK.
Решение состоит в том, чтобы указать версию urllib3, которую вы хотите, в своем файле require.txt (поскольку вы знаете, какие версии его зависимостей вы используете). В любом случае, это хорошая практика для временных пакетов без ограничений.
На самом деле, способ иметь воспроизводимые сборки с помощью pip - это всегда делать
pip freeze > requirements.txt
и проверьте результат. Таким образом, обновление стороннего пакета не нарушит вашу сборку, и вы всегда можете обновить его позже (и проверить результат).