Упаковка из питона. Укажите требования к версии python после нескольких выпусков

#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 установочного пакета, который не будет работать.

Я могу думать о:

  1. Путь cx_Oracle. Создание исключения в setup.py если минимальная версия не соответствует требуемой для установки, и укажите, как установить правильную версию.
  2. Создайте 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.