(按照Heroku的支持指引在此咨询)
我们发现一个项目中存在依赖问题,开发环境中库不匹配。细节并不重要,但根本原因是一种依赖有一个“>=”版本匹配在它的setup.py
中 - 这意味着当一个开发者重新构建他的环境时,他会突然得到最新版本(0.4.0),而不是他先前拥有的旧版本(0.3.11),并开始收到一个DeprecationWarning
。
作为调试过程的一部分,我认为每当将repo推送到Heroku时,将会重新构建一个干净的环境,这让我错误地假设我们的DEV环境(每天重新构建)已经安装了最新版本。因为我们在dev环境上没有看到这个问题,所以我决定进行调查,并在远程环境上运行heroku run pip list
。
我很惊讶地发现,这个输出是旧版本和过期依赖项的抽签,而且根本不是一个干净的环境。结果我们可能在我们的live环境中有这个我们正在调试的问题,作为一个旧版的安装包的一部分。
最简单的解释是BeautifulSoup库。我们最近从v3升级到v4,在此过程中,库本身在PyPI上的名称从BeautifulSoup
更改为beautifulsoup4
。我们更新了requirements.txt
以反映这一点,但是如果我现在在Heroku环境中运行pip list
,我会得到两个版本:
~ $ heroku run bash
~ $ pip list
BeautifulSoup (3.2.1)
beautifulsoup4 (4.3.2)
所以,旧的依赖关系并没有被清除,它只是在那里。我可以通过启动一个Python会话轻松地证明它:
~ $ python
Python 2.7.4 (default, Apr 6 2013, 22:14:13)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import bs4
>>> import BeautifulSoup
>>>
这有点令人惊讶,我很惊奇为什么这没有在某个时候导致应用程序崩溃?
那么问题来了 - Heroku如何在后台管理依赖项 - 显然它不会擦除Python环境并在每次部署时重新运行pip install
- 我能否强制执行此操作?
[编辑1]
顺便说一下,这是执行安装的buildpack - https://github.com/heroku/heroku-buildpack-python/blob/master/bin/compile
[编辑2]
从Heroku Buildpack文档中:
CACHE_DIR的内容将在构建之间保持。您可以将诸如依赖关系分辨率之类的长时间过程的结果缓存到此处,以加速未来的构建。
并且往下说:
bin/compile脚本将得到CACHE_DIR作为其第二个参数,该参数可用于在构建之间存储工件。存储在此目录中的工件将在后续构建期间在CACHE_DIR中可用。CACHE_DIR仅在编译包时可用,并且特定于正在构建的应用程序。
建议是:
Heroku用户可以使用heroku-repo插件清除他们的应用程序所使用的buildpack创建的构建缓存
也就是说 - 虽然我理解缓存被用来加速未来的编译,但我不明白为什么会安装缓存中的所有内容。这没有任何意义?
heroko_repo
和purge_cache
至少清理了环境,让我们找出了实际发生了什么。这与日常维护一样重要 - 清除我们不再依赖的旧依赖项。 - Hugo Rodger-Brown