【发布时间】:2012-07-13 10:35:39
【问题描述】:
我想制作一个依赖于特定版本范围的包,例如>= 0.5.0, < 0.7.0。 install_requires 选项中是否可以,如果可以,应该怎么做?
【问题讨论】:
-
你试过什么? The docs 似乎表明语法就像您在问题中所使用的那样有效。
标签: python setuptools
我想制作一个依赖于特定版本范围的包,例如>= 0.5.0, < 0.7.0。 install_requires 选项中是否可以,如果可以,应该怎么做?
【问题讨论】:
标签: python setuptools
根据the documentation,您的语法应该可以正常工作。该文档指出:
setuptools和pkg_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
两个附加说明。
docutils >= 0.3, >=0.2 将组合成 docutils >= 0.3。docutils >= 0.3, <=0.2,因为这是不可能的。 【讨论】:
>= 0.3, >=0.2 与 >=0.2 组合起来才有意义。但是>= 0.3, <=0.5 或您关于版本规范矛盾的段落需要逗号来表示和。
(>=1.0 AND <2) OR (>=2.7 AND <2.9) OR (>=4)
警惕非自愿的 Beta 测试。包维护者有时会在没有警告的情况下向普通受众发布不兼容、不完整或损坏的 a、b 和 c 版本。下次您在新的 virtualenv 中运行 setup.py 时,您可能会拉下其中一个毒鸡蛋,然后您的程序会突然中断。
为降低此风险,请勿使用 foo >=0.3, <0.4 样式声明,该声明具有纯数字上限。 <0.4 仍然承认 0.4a0、0.4a1、0.4b0、0.4c3 等版本。相反,在编写 install_requires 时,请使用 <0.4a0 之类的上限,如 foo >=0.3, <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."
【讨论】:
install_requires)?
另一种方法是使用通配符。
这不适用于 >= 0.5.0,
== 0.5.*
例如 docutils == 0.3.*
【讨论】:
==;我从我的 Anaconda 需求文件中获取版本号,它使用 =。我很困惑。
OP 的问题中提到的符号>= 0.5.0, < 0.7.0 已经有效。
而且,由于许多(如果不是大多数)库已经使用semantic versioning,因此根据定义,您可以将依赖项定义为A>=1,<2,explained here。他们甚至实现了an even simpler syntax for it, A~=X.Y,这意味着它至少需要发布 X.Y,但也允许任何具有匹配 MAJOR 版本的更高版本。
【讨论】: