Как разрешение зависимостей работает с 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

и проверьте результат. Таким образом, обновление стороннего пакета не нарушит вашу сборку, и вы всегда можете обновить его позже (и проверить результат).

Другие вопросы по тегам