#python #pip #setuptools #pypi
Вопрос:
У меня есть пакет, опубликованный на pypi и имеющий версию 3.0.0.
setup.py
никогда не упоминал python_requires
о директиве.
В выпуске 2.5.0 произошло изменение, которое сделало пакет несовместимым с python 2, которое до сих пор оставалось незамеченным.
Начиная с версии 2.5.0 на pypi было опубликовано множество выпусков пакета.
Теперь, если я захочу установить пакет с помощью python2, pip установит последнюю версию 3.0.0, которая не будет работать.
Мне нужен pip для установки версии 2.4.0, у которой нет проблем с совместимостью. Но как именно я могу этого добиться? (без предварительного знания пакета установки pip==2.4.0 — что-то вроде использования механизма возврата pip)
Если я укажу директиву python_requires=">=3.6"
в выпуске 3.1.0, pip вернется к выпуску 3.0.0 установочного пакета, который не будет работать.
Я могу думать о:
- Путь cx_Oracle. Создание исключения в setup.py если минимальная версия не соответствует требуемой для установки, и укажите, как установить правильную версию.
- Создайте 2 новых выпуска. Один, который по сути имеет версию 2.4.0 как 3.1.0 с
python_requires=">=2.7,<3.6"
, и один, который имеет версию 3.0.0 как 3.1.1 сpython_requires=">=3.6"
Есть ли лучший способ?
Ответ №1:
Есть относительно новая функция на PyPI: вы можете «выдернуть» релизы, которые несовместимы с Python 2, но неправильно указать это в метаданных.
Сорванный выпуск-это выпуск, который всегда игнорируется установщиком, если только он не является единственным выпуском, который соответствует описателю версии (с использованием либо ==
или ===
).
См. PEP 592 — Добавление поддержки «Yank» в простой API для получения дополнительной информации. На самом деле, то, что вы описали, является основным сценарием, описанным в разделе мотивации PEP.
Комментарии:
1. Очень милый. Если я правильно понимаю, для выдергивания мне нужно создать новый релиз с правильными метаданными, а затем выдернуть все релизы, которые «сломаны» для python2, чтобы pip вернулся к версии 2.4.0. Действительно, очень приятно. Мне нравится это решение, хотя мы могли бы переиздать две версии, как это также описано в упомянутом PEP.