什么是setuptools要求的形式"包===版本"

时间:2015-05-19 16:34:23

标签: python setuptools

假设我有一个包含控制台脚本的软件包,例如

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会使用它?

1 个答案:

答案 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解释了语法和语义:

  

通过检查提交中的其他文件和相关的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