【问题标题】:How to specify version ranges in install_requires (setuptools, distribute)如何在 install_requires 中指定版本范围(setuptools、distribute)
【发布时间】:2012-07-13 10:35:39
【问题描述】:

我想制作一个依赖于特定版本范围的包,例如>= 0.5.0, < 0.7.0install_requires 选项中是否可以,如果可以,应该怎么做?

【问题讨论】:

  • 你试过什么? The docs 似乎表明语法就像您在问题中所使用的那样有效。

标签: python setuptools


【解决方案1】:

根据the documentation,您的语法应该可以正常工作。该文档指出:

setuptoolspkg_resources 使用通用语法来指定项目所需的依赖项。此语法由项目的 PyPI 名称组成,可选地后跟以逗号分隔的方括号中的“附加”列表,可选地后跟以逗号分隔的版本说明符列表。版本说明符是运算符 、=、== 或 != 之一,后跟版本标识符。

文档给出了一个这样的简单示例:

docutils >= 0.3

# comment lines and \ continuations are allowed in requirement strings
BazSpam ==1.1, ==1.2, ==1.3, ==1.4, ==1.5, \
    ==1.6, ==1.7  # and so are line-end comments

进一步扩展,如果你希望你的包需要一个高于 0.3 版但低于 0.5 版的 docutils 版本,这样的代码可以工作:

docutils >= 0.3, <=0.5

两个附加说明。

  1. 文档还指出,冗余/重叠的依赖规范将在内部组合,因此 docutils &gt;= 0.3, &gt;=0.2 将组合成 docutils &gt;= 0.3
  2. 另外,请注意指定冲突的版本号,"is meaningless and may therefore produce bizarre results." 例如,我不知道你为什么会这样做,但不要使用:docutils &gt;= 0.3, &lt;=0.2,因为这是不可能的。

【讨论】:

  • 很好的答案,但让我感到困惑的是,逗号有时表示 or,有时表示 and:确切的版本规范列表清楚地显示 '1.1或 1.2 或 ...' 并将 &gt;= 0.3, &gt;=0.2&gt;=0.2 组合起来才有意义。但是&gt;= 0.3, &lt;=0.5 或您关于版本规范矛盾的段落需要逗号来表示
  • 以@zpea 的问题为基础:有没有办法定义多个版本范围?例如(&gt;=1.0 AND &lt;2) OR (&gt;=2.7 AND &lt;2.9) OR (&gt;=4)
  • 文档说 >1, >2 变为 >1,但正如您所说,变为 >2 会更有意义。有谁知道为什么?
【解决方案2】:

警惕非自愿的 Beta 测试。包维护者有时会在没有警告的情况下向普通受众发布不兼容、不完整或损坏的 a、b 和 c 版本。下次您在新的 virtualenv 中运行 setup.py 时,您可能会拉下其中一个毒鸡蛋,然后您的程序会突然中断。

为降低此风险,请勿使用 foo &gt;=0.3, &lt;0.4 样式声明,该声明具有纯数字上限。 &lt;0.4 仍然承认 0.4a0、0.4a1、0.4b0、0.4c3 等版本。相反,在编写 install_requires 时,请使用 &lt;0.4a0 之类的上限,如 foo &gt;=0.3, &lt;0.4a0

setuptools 出现意外情况时,尝试使用 verlib 为您的版本比较建模。只要您的版本标准化且不矛盾,Verlib 就非常适合。下面是一个示例,展示了规范化版本可能违反直觉的排序:

#!/usr/bin/env python

from verlib import NormalizedVersion as V

assert (V("0.7.9") < V("0.8a0") < V("0.8a1") < V("0.8b0") < V("0.8b1")
    < V("0.8b2") < V("0.8.0") < V("0.8.1a0") < V("0.8.1") < V("0.9")
    < V("1.0a3") < V("1.0b2") < V("1.0b20") < V("1.0c0") < V("1.0")
    < V("1.0.1"))

assert (V("0.7.9") < V("0.8.0a0") < V("0.8.0a1") < V("0.8.0b0")
    < V("0.8.0b1") < V("0.8.0b2") < V("0.8.0") < V("0.8.1a0") < V("0.8.1")
    < V("0.9") < V("1.0a3") < V("1.0b2") < V("1.0b20") < V("1.0c0")
    < V("1.0") < V("1.0.1"))

print "Version comparisons are sane."

【讨论】:

  • 如何在 setup.py 文件中使用 verlib (install_requires)?
【解决方案3】:

另一种方法是使用通配符。

这不适用于 >= 0.5.0,

== 0.5.*

例如 docutils == 0.3.*

【讨论】:

  • 这是我在几个显示等于的 setup.py 语法的站点之后发现的唯一设置工具示例,==;我从我的 Anaconda 需求文件中获取版本号,它使用 =。我很困惑。
【解决方案4】:

OP 的问题中提到的符号&gt;= 0.5.0, &lt; 0.7.0 已经有效。

而且,由于许多(如果不是大多数)库已经使用semantic versioning,因此根据定义,您可以将依赖项定义为A&gt;=1,&lt;2explained here。他们甚至实现了an even simpler syntax for it, A~=X.Y,这意味着它至少需要发布 X.Y,但也允许任何具有匹配 MAJOR 版本的更高版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-16
    • 2015-06-12
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2020-07-20
    • 2012-01-22
    相关资源
    最近更新 更多