缺失Wagtail Streamforms迁移文件导致Heroku部署失败
你遇到的是第三方包迁移在Heroku环境中无法被Django识别的典型场景,我来帮你一步步排查解决:
1. 补全自定义迁移模块的配置细节
你已经设置了MIGRATION_MODULES = {'wagtailstreamforms': 'myapp.wagtailstreamforms_migrations'},但还需要确保这些细节:
- 在你的项目里创建
myapp/wagtailstreamforms_migrations目录,并且在目录中添加空的__init__.py文件(让Python识别这是一个可导入的模块) - 把本地虚拟环境中
wagtailstreamforms包的迁移文件(路径一般是lib/python3.6/site-packages/wagtailstreamforms/migrations/)完整复制到这个自定义目录下 - 复制完成后,在本地运行
python manage.py makemigrations --check确认没有未检测到的迁移变化,再把这些自定义迁移文件提交到Git仓库
2. 确保Heroku部署时正确执行迁移
检查你的项目Procfile是否包含迁移的发布指令:
release: python manage.py migrate
如果已经配置,还可以手动在Heroku CLI强制执行迁移命令,确认是否有报错:
heroku run python manage.py migrate --app your-app-name
查看命令输出,重点确认wagtailstreamforms的迁移是否被正常识别并应用。
3. 清除Heroku依赖缓存,保证版本一致
Heroku的pip缓存可能导致旧版本的wagtailstreamforms被保留,迁移文件缺失。可以通过以下命令清除缓存并重新部署:
heroku repo:purge_cache --app your-app-name git push heroku main
这会让Heroku重新安装所有依赖,确保wagtailstreamforms的版本和你requirements.txt中指定的完全一致,对应的迁移文件也会被正确安装到site-packages目录。
4. 对齐本地与Heroku的Python版本
你提到Heroku使用Python 3.6,要确保本地开发环境的Python版本也是3.6,避免版本差异导致的依赖或迁移兼容性问题。可以在项目根目录创建runtime.txt文件明确指定版本:
python-3.6.15
(注意版本号需符合Heroku官方支持的Python 3.6子版本列表)
5. 验证迁移状态一致性
在本地运行命令查看wagtailstreamforms的迁移状态:
python manage.py showmigrations wagtailstreamforms
确认所有迁移项都标记为[X](已应用)。然后在Heroku上运行同样的命令:
heroku run python manage.py showmigrations wagtailstreamforms --app your-app-name
对比两者的输出,如果Heroku上存在未应用的迁移,可单独执行命令应用该包的迁移:
heroku run python manage.py migrate wagtailstreamforms --app your-app-name
如果以上步骤都尝试后仍未解决,建议检查requirements.txt中wagtailstreamforms的版本是否明确指定(避免使用>=这类模糊版本),确保本地和Heroku安装的是完全相同的包版本,这样迁移文件才能完全匹配。
内容的提问来源于stack exchange,提问作者Cleverlemming

