问题描述
我在 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 install package==2.4.0 - 类似于使用 pip 的回溯机制)
如果我在 3.1.0 版中指定指令 python_requires=">=3.6"
,pip 将回溯到 3.0.0 版安装包,这将不起作用。
我能想到:
-
cx_Oracle way。如果最小版本与安装所需的版本不匹配并指定如何安装正确的版本,则在 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"
有更好的方法吗?
解决方法
PyPI 有一个相对较新的功能:您可以“猛拉”与 Python 2 不兼容但未在元数据中正确指定的版本。
被移除的版本是一个总是被安装程序忽略的版本,除非它是唯一与版本说明符匹配的版本(使用 ==
或 ===
)。
有关详细信息,请参阅 PEP 592 -- Adding "Yank" Support to the Simple API。事实上,您所描述的是 PEP 的 motivation 部分中描述的主要场景。