使用`--pre`选项时,pip不匹配预发布版本

Lai*_*kus 7 python pip setuptools pypi setup.py

假设您发布了两个预发布版本:

 package 0.0.1.dev0
 package 0.0.2.dev0
Run Code Online (Sandbox Code Playgroud)

我的install_requires部分setup.py指出:

[
    'package>=0.0.2,<1.0.0'
]
Run Code Online (Sandbox Code Playgroud)

现在,当我运行时pip install . --upgrade --pre出现错误:

错误:找不到满足要求的版本 package<1.0.0,>=0.0.2(来自版本:0.0.1.dev0, 0.0.2.dev0) 错误:没有找到与 package<1.0.0 匹配的发行版,>=0.0.2

我究竟做错了什么?该--pre标志不应该告诉 pip 匹配预发布版本吗?

Chr*_*ert 7

概括

pip--pre选项指示 pip 包含潜在匹配的预发布版本和开发版本,但它不会更改版本匹配的语义。

由于预发布版本0.0.2.dev0早于稳定版本0.0.2,因此当搜索至少与稳定版本一样新的包时,pip 会正确报告错误0.0.2

解释

混淆的关键点在于 pip--pre选项,该选项记录为:

--pre
包括预发布版本和开发版本。默认情况下,pip 只查找稳定版本。

问题的前提是该--pre选项应该更改包版本匹配语义,以便在与稳定版本匹配时忽略预发布版本后缀。

为了进一步澄清,请考虑兼容的发布运算符~=。PEP 440 部分兼容版本,部分说明:

对于给定的发布标识符V.N,兼容的发布子句大约相当于一对比较子句:

>= V.N, == V.*

...

如果预发布、后发布或开发版本在兼容发布子句中命名为V.N.suffix,则在确定所需的前缀匹配时将忽略后缀:

~= 2.2.post3 = 2.2.post3, == 2.*

~= 1.4.5a4 = 1.4.5a4, == 1.4.*

此示例清楚地表明后缀被忽略。

以下要求不符合0.0.2.dev0

install_requires=['package~=0.0.2']  # ERROR: ResolutionImpossible
Run Code Online (Sandbox Code Playgroud)

而这个例子确实匹配稳定版本0.0.2

install_requires=['package~=0.0.2.dev0']  # OK - suffix ignored
Run Code Online (Sandbox Code Playgroud)