Django:Requirements.txt

时间:2018-09-29 08:23:11

标签: python django requirements.txt

到目前为止,我知道的是requirements.txt,例如:Django==2.0。现在我看到了这种写作风格Django>=1.8,<2.1.99

你能告诉我什么意思吗?

1 个答案:

答案 0 :(得分:0)

requirements.txt是一个文件,其中指定了依赖项。例如,您的程序在这里将取决于Django(那么您可能不想自己实现Django)。

如果仅编写一个自定义应用程序,并且不打算将其导出(例如作为库)导出给其他程序员,则可以固定该库的版本,例如Django==2.0.1。然后,您始终可以假设(假设pip已成功安装了正确的软件包)您的环境将具有正确的版本,因此,如果您遵循正确的文档,将不会有任何问题(应该 )出现。

但是,如果您实现一个库,例如mygreatdjangolibrary,则您可能不想固定该版本:这意味着每个想要使用您的库的人都必须安装Django==2.0.1。假设他们想要一个仅在中可用的功能,那么他们可以-严格遵循依赖关系-不这样做:您的库需要2.0.1。这当然是无法管理的。

因此,通常在图书馆中,人们旨在给图书馆用户以尽可能多的自由。如果无论用户安装了Django版本如何,您的库都可以工作,那将是理想的选择。

不幸的是,这将给库开发人员带来很多麻烦。假设您必须考虑到用户最多可以使用的Django-1.1。多年来,由于程序员应该保守一些功能,并引入了一些库无法使用的功能,并考虑到用户安装的库中可能不存在这些功能。

自Django经过一些重构以来​​,情况变得更糟:某些功能后来被删除,因此我们不能简单地在上编程并希望一切顺利。

因此,在这种情况下,指定我们支持的版本的 range 是有意义的。例如,我们可以阅读的文档,并查看发行说明以了解中是否有相关的更改,并让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版本。

以上内容甚至很容易变得更加复杂。由于libalibb当然也具有版本,例如:

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,我们需要找到“允许”安装的libalibb版本Django版本,这并不是什么小事,因为例如,如果我们选择libb-0.1,则没有liba版本支持“重叠” Django版本。

据我所知,pip目前没有 no 依赖项解析算法。它着眼于规范,每次旨在选择满足约束条件的最新规范,然后递归安装这些软件包的依赖项。

因此,用户应确保(子)依赖项不冲突:如果我们指定liba libb==0.1,那么pip可能会安装{{1} },然后发现Django-2.1对此无效。

有一些依赖性解决程序。但是事实证明这个问题很难解决(如果我没记错的话,这是 NP难)。因此,这意味着对于给定的依赖关系树,可能需要数年才能找到有效的配置。