首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >姜戈: requirements.txt

姜戈: requirements.txt
EN

Stack Overflow用户
提问于 2018-09-29 08:23:10
回答 1查看 2.5K关注 0票数 0

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

你能给我解释一下这是什么意思吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-29 19:52:26

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上编程,希望一切顺利。

因此,在这种情况下,指定我们支持的一系列版本是有意义的。例如,我们可以阅读django-2.0的文档,并查看发布说明,看看django-2.1中是否有相关的变化,并让tox测试我们编写的测试的两个版本。因此,我们可以指定一个类似于Django>=2.0,<2.1.99的范围。

如果您依赖几个库(每个库都是共同的需求),那么这一点也很重要。例如,您希望安装一个库liba,和一个库libb,两者都依赖Django,bot两者有一个不同的范围,例如:

代码语言:javascript
复制
liba:
    Django>=1.10, <2.1
libb:
    Django>=1.9, <1.11

因此,这意味着我们只能在>=1.10<1.11之间安装一个<1.11版本。

上面的事情甚至很容易变得更加复杂。因为libalibb当然也有版本,例如:

代码语言:javascript
复制
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,我们需要找到一个“允许”我们安装Django版本的libalibb版本,这并不简单,因为如果我们选择libb-0.1,那么就没有支持“重叠”Django版本的liba版本。

据我所知,pip目前没有依赖解决算法。它查看规范,每次都希望选择满足约束的最新版本,并递归地安装这些包的依赖项。

因此,应该由用户确保(子)依赖关系不发生冲突:如果我们指定liba libb==0.1,那么pip可能会安装Django-2.1,然后发现libb无法处理这个问题。

有一些依赖解决程序。但问题最终证明是相当困难的(如果我没记错的话,这是NP难的)。因此,这意味着对于给定的依赖树,找到有效的配置可能需要数年时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52566559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档