部署Django应用至Heroku遇错误:wrapt==1.12.1不适用于heroku-18栈
问题原因与解决方法
我之前也踩过Heroku旧栈的依赖兼容坑,这个问题其实很好拆解:
为什么会出现这个错误?
Heroku-18栈基于Ubuntu 18.04,这个系统版本比较老,而wrapt==1.12.1的预编译二进制包(wheel)没有适配这个旧系统的架构;同时Heroku默认的Python buildpack在编译源码版本时,缺少必要的系统编译依赖(比如gcc、Python开发头文件),导致pip无法成功编译安装这个版本的wrapt,最终抛出“不适用于当前栈”的错误。
另外,如果你是直接在requirements.txt里硬指定了wrapt==1.12.1,而没有考虑栈的兼容性,也会触发这个问题——毕竟新版本的wrapt已经修复了旧系统的兼容问题,但旧版本没有对应的预编译包。
具体解决方法
根据你的需求,有三个可行方案,按优先级排序:
1. 升级wrapt到兼容版本
这是最简单的解决方式,大多数情况下不需要死守旧版本。你可以:
- 本地运行
pip install wrapt>=1.13.0(1.13.x及以上版本都适配heroku-18) - 更新
requirements.txt里的wrapt版本号为wrapt>=1.13.0或者具体的兼容版本(比如wrapt==1.14.1) - 重新提交代码并部署到Heroku,这个时候pip会找到适配heroku-18的预编译包,顺利安装。
2. 为旧版本wrapt添加编译依赖
如果你因为某些原因必须使用wrapt==1.12.1,那需要让Heroku安装编译源码所需的系统依赖:
- 在项目根目录创建一个名为
Aptfile的文件,内容写入:python-dev gcc - 给Heroku添加apt buildpack(用来安装系统包):
heroku buildpacks:add --index 1 heroku-community/apt - 提交
Aptfile并重新部署,此时Heroku会先安装gcc和Python开发头文件,再编译wrapt的源码,就能成功安装了。
3. 升级Heroku栈到更高版本
如果你的应用没有依赖只能在heroku-18上运行的组件,建议直接升级Heroku栈到更新的版本(比如heroku-22,基于Ubuntu 22.04),这样能从根本上解决很多旧依赖的兼容问题:
- 运行命令切换栈:
heroku stack:set heroku-22 - 重新部署应用,新版本的栈支持更多现代Python包的预编译轮子,wrapt的安装会顺畅很多。
补充:如果你的完整错误信息是类似“Failed to install packages: wrapt==1.12.1 is not compatible with this stack (heroku-18)”或者找不到匹配的发行版,上面的方案都能解决。
内容的提问来源于stack exchange,提问作者AL Drake
相关产品推荐
相关产品推荐

