Heroku Python Buildpack安装时缺失entry_points.txt问题排查
你的问题核心是Heroku部署后,Django可重用应用的.egg-info/entry_points.txt文件未生成,导致pkg_resources.iter_entry_points无法正常获取插件列表。结合你的环境和配置,我整理了几个针对性的排查方向和解决方案:
1. 检查setup.py中entry_points的格式是否正确
你当前的entry_points定义是:
entry_points={'my.group': 'foo = bar'},
这里存在格式问题——setuptools要求每个entry point组对应的值是字符串列表,哪怕只有一个entry point也需要用列表包裹:
entry_points={'my.group': ['foo = bar']},
格式错误可能导致本地环境因兼容性侥幸生效,但在Heroku标准化的构建流程中,setuptools会跳过entry_points.txt的生成。
2. 强制Heroku构建时生成egg-info
Heroku的Python Buildpack默认执行pip install,但在依赖缓存、安装私有仓库包等场景下,可能会跳过egg-info生成步骤。你可以通过两种方式强制触发:
- 在
setup.py中添加setup_requires=['setuptools'],确保构建时加载setuptools并处理entry points:setup( # 其他配置项... setup_requires=['setuptools'], entry_points={'my.group': ['foo = bar']}, ) - 添加
post_compile脚本手动生成egg-info:
在项目根目录创建.profile.d/post_compile.sh文件,内容如下:
给脚本添加执行权限:#!/bin/bash cd /app python setup.py egg_infochmod +x .profile.d/post_compile.sh,然后提交到Git仓库。
3. 确认Buildpack的执行顺序
你使用了heroku-buildpack-github-netrc处理私有仓库认证,必须确保Python Buildpack是最后一个执行的。Buildpack按顺序执行,如果netrc的Buildpack在Python之后,可能会干扰依赖安装流程。
查看当前Buildpack顺序:
heroku buildpacks
如果顺序错误,调整Python Buildpack到最后:
heroku buildpacks:add --index 2 heroku/python
(--index 2根据你的实际Buildpack数量调整,确保Python Buildpack处于最后一位)
4. 清除Heroku构建缓存
Heroku会缓存过往的依赖安装结果,旧缓存可能导致新构建未重新生成egg-info。执行以下命令清除缓存并重新部署:
heroku repo:purge_cache git push heroku main
这会让Heroku重新执行完整的依赖安装流程,确保生成最新的.egg-info文件。
5. 验证私有仓库包的安装格式
如果requirements.txt中包含私有GitHub仓库的包,比如git+https://github.com/your/repo.git,可以尝试显式指定包名(现代pip版本通常不需要,但能确保egg-info生成):
git+https://github.com/your/repo.git#egg=your-package-name
内容的提问来源于stack exchange,提问作者Kevin Eaverquepedo

