假设我有一个包含控制台脚本的软件包,例如
from setuptools import setup
setup(
name='eg_package',
version='0.0.1',
description='Trivial test package',
packages=[
'eg_package',
],
entry_points={
'console_scripts': [
'foo = eg_package.main:main',
]
},
)
如果我使用egg_info -b mytag
设置和显式构建代码,则生成的脚本具有__requires__ = 'eg-package===0.0.1mytag'
,即使用3" ="迹象。当标签不像b1
这样的传统标签时,会发生这种情况。
起初我认为这是一个错误,但setuptools文档表明它是一个有效的需求标识符。但是,它不适用于旧版本的setuptools,这会导致我们的系统出现问题。
我的问题是"==="
是什么意思以及为什么现代setuptools
会使用它?
答案 0 :(得分:2)
Requirement specifier section in pip
docs指向official docs for requirement specifiers implemented by setuptools
pkg_resources
的链接。它指定了正式的语法,但没有说明语义。
Overview docs解释了语义,但在~=
和===
内容中没有说明,这些内容显然是在vv.7(安装了python 2.7.9)和16之间添加的。
当文档失败时,是时候咨询来源了。下载setuptools hg repo并注释pkg_resources/__init__.py
最终会带来changeset 3125消息“使用打包库实现PEP 440”。
确实,PEP 440, Version Specifiers section解释了语法和语义:
- 〜=:Compatible release条款 < ...>
- ===:Arbitrary equality条款。
通过检查提交中的其他文件和相关的packaging
包,我得出了这些明显的结论:
~=
永远不会产生;当处理 1 时,它根据PEP中概述的规则充当过滤器。===
在处理时,会发出信号以回退到较旧的setuptools
版本语法和比较逻辑。只要生成的版本字符串不符合PEP 2 。 1 <子>
在pkg_resources._vendor.packaging.specifiers._compare_compatible()
2 pkg_resources.parse_version()
生成pkg_resources.SetuptoolsLegacyVersion
而不是pkg_resources.SetuptoolsVersion