Heroku for Django 应用程序的条件 pip 安装要求

Posted

技术标签:

【中文标题】Heroku for Django 应用程序的条件 pip 安装要求【英文标题】:Conditional pip install requirements on Heroku for Django app 【发布时间】:2012-08-18 05:22:54 【问题描述】:

首先让我说,我不认为有办法做到这一点......但是,那里有很多聪明的人,所以我想我会问! :)

我在setting up a Django app on Heroku (Internet Archive link) 上找到了 Randall Degges 的一篇好文章/帖子。我真的很喜欢他所说的将您的需求分解为不同的文件(common.txt、dev.txt、prod.txt 等)。

这在 Heroku 上非常适用于生产环境,但我还在 Heroku 上维护了一个 Dev/QA 站点,并且我有一些我确实不需要用于开发/QA 的 prod 包。最好的例子是 django-debug-toolbar。目前,我的生产 requirements.txt 中确实有这个,我在运行时通过查看 DEBUG 设置动态决定是否需要将它添加到我安装的应用程序等中。

这很好用...但是,如果我什至不用费心将其安装在 prod 中,那就太好了。我想我想要的是让 pip 能够获取一个允许条件包含的需求文件(为什么它不能只获取一个 python 文件?)或者让 Heroku 支持一个配置设置来告诉它哪个需求文件使用。有没有人找到实现这一目标的方法?还是只是一厢情愿?

【问题讨论】:

【参考方案1】:

你看过this吗?

如果您的 Python 应用程序包含 setup.py 文件但不包括 requirements.txt 文件,python setup.py develop 将用于安装您的包并解决您的依赖项。 这最适用于分发或设置工具。直接使用 distutils 的项目会被安装,但不会被链接。该模块在版本升级之前不会更新。 如果您已经有一个需求文件但想使用此功能,您可以将以下内容添加到您的需求文件中:

-e .

然后按照Conditionally installing importlib on python2.6中的建议进行操作

【讨论】:

感谢您的回复。我确实对此进行了审查。我想我不确定 pip 和 setup.py 是如何交互的,等等。我确实对您在上面链接到的 SO 问题发表了评论/问题。【参考方案2】:

我在构建中也有类似的需求,并在那里实现了它。 现在我正在从 buildout 迁移到 pip,我提出了这个脚本来根据某些条件使用一些不同的需求文件,这些文件可以基于 os/arch 或一些环境变量或任何你喜欢的东西。粗鲁但对我有效。

见https://gist.github.com/pombredanne/72130ee6f202e89c13bb

【讨论】:

【参考方案3】:

是的,这是一厢情愿。 pip 需求文件非常简单。从字面上看,所有 pip 所做的只是将pip install 添加到文件中的每一行,因此条件等是不行的。为每个环境提供单独的需求文件是个好主意,但问题是为什么不为您的 Dev/QA 站点也提供一个版本?

也就是说,无论如何,我认为这有点学术性。简单地安装一个软件包并不会伤害任何东西。例如,即使您在生产环境中安装了 django-debug-toolbar 软件包也没关系,您的生产实例实际上不会使用它,所以除了几千字节的驱动器空间之外占用,这不是问题。

就我个人而言,我总是只有一个需求文件,并且我只放了需求,即这些是网站字面上无法运行的软件包。 django-debug-toolbar、ipython 等。我需要时手动安装。

【讨论】:

感谢您的回复。为了回答您的问题,我可以为每个单独的文件。但是,Heroku 只查找名为 requirements.txt 的文件。因此,如果您有两个环境,那么确实没有一种好的方法可以控制将 pip 安装到每个环境中的内容。你说得对,这不是什么大不了的事,但是你在 requirements.txt 中的东西越多,加载你的应用程序或产生额外的测功机等的速度就越慢。同样,这不是什么大不了的事。但是,最好让它尽可能精简。 好吧,恕我直言,最好的解决方案是仅在您的需求文件中放入真正的需求。即使在开发中,django-debug-toolbar 等也不是要求,当特定开发人员可能不想使用它时,强制安装它是没有意义的。 我同意 - 主要是 :) 但是,如果您的设置文件中有条件导入(就像我一样),那么您似乎不应该让未来的开发人员猜测什么是“必需的”那些特定的选项。理想情况下,我可以有一个环境变量来控制打开/关闭一组功能(并确保 pip 安装了所需的内容)。同样,这并不重要。只是希望今天能学到一些新东西。如果 Heroku 有一种方法可以为 app/env 配置 requirements.txt 文件,那将非常有用。 这就是您使用开发人员特定设置文件的原因。我有 dev、staging 和 prod 目录,在 dev 下,每个开发人员都有一个目录。然后,您只需将活动目录符号链接到“本地”之类的内容,并让 settings.py 导入 local.settings。这样,每个开发人员都可以拥有一个完全自定义的环境,而不必共享一个“开发”设置文件,如果您的开发人员使用不同的操作系统等,这几乎是不可能的。 是的;我以前使用过这种方法,但我不希望将它们检查到 git 中,然后推送到 Heroku 和生产环境。你用 Heroku 吗?还是您管理自己的平台?与 Heroku 交互的主要方式是从 git repo 推送,然后拥有可以通过命令行设置的配置变量。这对大多数事情都很好,您可以设置一个 env 标志,然后配置您想要的方式。但是,当涉及到您的需求文件时,这有点困难。因为,AFAIK,它只会读取您的应用程序文件夹中的 requirements.txt。

以上是关于Heroku for Django 应用程序的条件 pip 安装要求的主要内容,如果未能解决你的问题,请参考以下文章

Heroku for Django 1.8 的 Procfile

在 Heroku 上部署 React 和 Django

Heroku 上的 Django - 损坏的管理静态文件

在 Heroku 中使用 Braintree 和 Django 应用程序

Django,创建反应应用程序,Heroku

如何在 Heroku 上为 Django 应用程序设置数据库?