到目前为止,我知道的是requirements.txt,例如:Django==2.0
。现在我看到了这种写作风格Django>=1.8,<2.1.99
你能告诉我什么意思吗?
答案 0 :(得分:0)
requirements.txt
是一个文件,其中指定了依赖项。例如,您的程序在这里将取决于Django
(那么您可能不想自己实现Django)。
如果仅编写一个自定义应用程序,并且不打算将其导出(例如作为库)导出给其他程序员,则可以固定该库的版本,例如Django==2.0.1
。然后,您始终可以假设(假设pip
已成功安装了正确的软件包)您的环境将具有正确的版本,因此,如果您遵循正确的文档,将不会有任何问题(应该 )出现。
但是,如果您实现一个库,例如mygreatdjangolibrary
,则您可能不想固定该版本:这意味着每个想要使用您的库的人都必须安装Django==2.0.1
。假设他们想要一个仅在django-2.1中可用的功能,那么他们可以-严格遵循依赖关系-不这样做:您的库需要2.0.1。这当然是无法管理的。
因此,通常在图书馆中,人们旨在给图书馆用户以尽可能多的自由。如果无论用户安装了Django版本如何,您的库都可以工作,那将是理想的选择。
不幸的是,这将给库开发人员带来很多麻烦。假设您必须考虑到用户最多可以使用django-2.1的Django-1.1。多年来,由于程序员应该保守一些功能,并引入了一些库无法使用的功能,并考虑到用户安装的库中可能不存在这些功能。
自Django经过一些重构以来,情况变得更糟:某些功能后来被删除,因此我们不能简单地在django-1.1上编程并希望一切顺利。
因此,在这种情况下,指定我们支持的版本的 range 是有意义的。例如,我们可以阅读django-2.0的文档,并查看发行说明以了解django-2.1中是否有相关的更改,并让tox
测试两个版本的测试。因此,我们可以指定一个Django>=2.0,<2.1.99
之类的范围。
如果您依赖于几个常见的库,这也很重要。假设您要安装一个库liba
和一个库libb
,它们都依赖Django,而bot这两个库具有不同的范围,例如:
liba:
Django>=1.10, <2.1
libb:
Django>=1.9, <1.11
这意味着我们只能在Django
和>=1.10
之间安装<1.11
版本。
以上内容甚至很容易变得更加复杂。由于liba
和libb
当然也具有版本,例如:
liba-0.1:
Django>=1.10, <2.1
liba-0.2:
Django>=1.11, <2.1
liba-0.3:
Django>=1.11, <2.2
libb-0.1:
Django>=1.5, <1.8
libb-0.2:
Django>=1.10, <2.0
因此,如果我们现在想安装任何liba
和任何libb
,我们需要找到“允许”安装的liba
和libb
版本Django
版本,这并不是什么小事,因为例如,如果我们选择libb-0.1
,则没有liba
版本支持“重叠” Django版本。
据我所知,pip
目前没有 no 依赖项解析算法。它着眼于规范,每次旨在选择满足约束条件的最新规范,然后递归安装这些软件包的依赖项。
因此,用户应确保(子)依赖项不冲突:如果我们指定liba
libb==0.1
,那么pip
可能会安装{{1} },然后发现Django-2.1
对此无效。
有一些依赖性解决程序。但是事实证明这个问题很难解决(如果我没记错的话,这是 NP难)。因此,这意味着对于给定的依赖关系树,可能需要数年才能找到有效的配置。