【问题标题】:In requirements.txt, what does tilde equals (~=) mean?在 requirements.txt 中,波浪号等于 (~=) 是什么意思?
【发布时间】:2017-01-28 03:32:42
【问题描述】:

在我正在使用的 Python 库的 requirements.txt 中,指定了以下要求之一:

mock-django~=0.6.10

~= 是什么意思?

【问题讨论】:

    标签: python requirements.txt


    【解决方案1】:

    ~=Compatible release(包括发布前和发布后)的完整定义是:

    兼容的版本条款由兼容的版本组成 运算符~= 和版本标识符。它匹配任何候选版本 预计与指定版本兼容。

    指定的版本标识符必须是标准格式 在Version scheme 中描述。本地版本标识符不是 此版本说明符中允许。

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

    >= V.N, == V.*
    

    此运算符不得与单个段版本号(例如 ~=1)一起使用。

    例如,以下几组版本子句是等价的:

    ~= 2.2
    >= 2.2, == 2.*
    
    ~= 1.4.5
    >= 1.4.5, == 1.4.*
    

    如果预发布、发布后或开发版本以 兼容释放条款为V.N.suffix,则后缀被忽略 在确定所需的前缀匹配时:

    ~= 2.2.post3
    >= 2.2.post3, == 2.*
    
    ~= 1.4.5a4
    >= 1.4.5a4, == 1.4.*
    

    释放段比较的填充规则意味着 兼容发行条款中假定的前向兼容性程度 可以通过在版本中附加额外的零来控制 说明符:

    ~= 2.2.0
    >= 2.2.0, == 2.2.*
    
    ~= 1.4.5.0
    >= 1.4.5.0, == 1.4.5.*
    

    【讨论】:

      【解决方案2】:

      除了现有的答案之外,我认为还提到这一点非常重要

      ~=0.6.10 表示 >=0.6.10, ==0.6.*

      以下也是正确的

      ~=0.6 表示 >=0.6,==0.*

      PEP documentation中提到过。

      【讨论】:

        【解决方案3】:

        表示会选择最新版本的包,大于等于0.6.10,但还是0.6.*版本,所以不会下载0.7.0等。如果包维护者尊重语义版本控制(它规定重大更改只应在主要版本中发生),它可确保您获得安全修复但保持向后兼容性。

        或者,正如 PEP 440 所说:

        对于给定的发布标识符 V.N ,兼容的发布子句大致等价于一对比较子句:

        >= V.N, == V.*

        【讨论】:

        • “大约”?这种等效是否有任何例外?
        • @AXO AFAIK,发布前/发布后版本匹配存在细微差别。大多数情况下,这不会影响基本使用,主要限于主要/次要版本匹配。
        【解决方案4】:

        这是“兼容版本”version specifier

        相当于:mock-django >= 0.6.10, == 0.6.*,是一种匹配预期兼容版本的简洁方式。用简单的英语来说,这有点像说:“我需要一个至少与 0.6.10 一样新的 mock-django 版本,但又不是太新以至于不兼容。”

        如果您不确定所有这些版本号,请快速查看 PEP440 version scheme 应该可以解决您的问题!

        【讨论】:

          【解决方案5】:

          ~= 表示兼容版本。不低于 0.6.10 及更高 (0.6.*)。

          【讨论】:

            【解决方案6】:

            兼容的发布子句由兼容的发布运算符 ~= 和版本标识符组成。它匹配任何预期与指定版本兼容的候选版本。

            您可以在这里阅读更多内容:https://www.python.org/dev/peps/pep-0440/#compatible-release

            【讨论】: