60

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

4

4 回答 4

52

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

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

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

docutils >= 0.3, <=0.5

两个附加说明。

  1. 该文档还指出,冗余/重叠的依赖规范将在内部组合,因此docutils >= 0.3, >=0.2将组合成docutils >= 0.3.
  2. 此外,请注意指定冲突的版本号,这“没有意义,因此可能会产生奇怪的结果”。例如,我不知道你为什么会这样做,但不要使用这个:docutils >= 0.3, <=0.2因为这是不可能的。
于 2012-07-15T20:44:51.383 回答
18

警惕非自愿的 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."
于 2013-01-18T18:27:31.500 回答
3

OP 的问题中提到的符号>= 0.5.0, < 0.7.0, 已经有效。

而且,由于许多(如果不是大多数)库已经使用语义版本控制,因此根据定义,您可以将依赖项定义为A>=1,<2,如此处所述。他们甚至为它实现了一个更简单的语法,这A~=X.Y意味着它至少需要发布 XY,但也允许任何具有匹配 MAJOR 版本的更高版本。

于 2019-05-14T22:30:34.690 回答
2

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

这不适用于 >= 0.5.0, < 0.7.0,但如果您决定应该支持所有维护版本(例如 0.5.0 到 0.5.x),您可以使用

== 0.5.*

例如 docutils == 0.3.*

于 2019-04-16T13:08:22.533 回答