我想制作一个包依赖于特定的版本范围,例如>= 0.5.0, < 0.7.0
。是否有可能在install_requires
选项中,如果是这样,它应该如何?
根据the documentation,您的语法应该正常工作。文件指出:
setuptools
和pkg_resources
使用通用语法来指定项目所需的依赖项。此语法由项目的PyPI名称组成,可选地后跟逗号分隔的方括号中的“extras”列表,可选地后跟逗号分隔的版本说明符列表。版本说明符是运算符之一,<=,> =,==或!=,后跟版本标识符。
文档提供了一个这样的简单示例:
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
,因为这是不可能的。警惕非自愿的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."
另一种方法是使用通配符。
这不适用于> = 0.5.0,<0.7.0,但如果您决定支持所有维护版本(例如0.5.0到0.5.x),您可以使用
== 0.5.*
例如docutils == 0.3。*
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版本。