Heroku部署报错Compiled Slug Size过大但本地文件体积小如何解决
问题描述
自主开发的tweetbot部署至Heroku平台时,代码推送流程被阻断,返回错误信息如下:
Compressing... remote: ! Compiled slug size: 617.8M is too large (max is 500M). remote: ! See: http://devcenter.heroku.com/articles/slug-size remote: remote: ! Push failed remote: ! remote: ! ## Warning - The same version of this code has already been built: 1a2970cd3545cb60eb76f77769d6cf7c58d3c4ae remote: ! remote: ! We have detected that you have triggered a build from source code with version 1a2970cd3545cb60eb76f77769d6cf7c58d3c4ae remote: ! at least twice.
本地项目源码本身体积极小,无法定位编译后617.8M slug体积的来源,需明确排查方向与可行解决方案。
注意:返回信息中的重复代码版本警告不是推送失败的核心原因,仅代表本次构建复用了同版本代码的历史构建缓存,阻断推送的核心问题是slug体积超出500M的平台上限。
排查方向
- 依赖项冗余:这是slug体积超标的最常见原因。轻量bot项目如果误将开发依赖、全量机器学习/计算机视觉类大体积库、无实际调用的依赖包纳入生产依赖清单,很容易直接把slug体积顶到阈值以上。Heroku构建时会默认全量安装依赖配置中声明的生产依赖,不会自动裁剪未使用内容。
- 非运行时文件误打包:如果没有配置过滤规则,本地虚拟环境目录、依赖缓存目录、测试数据集、本地日志、大体积媒体素材、模型权重文件、数据库备份、文档目录等非运行必需的文件,都会被直接打入最终slug。
- 构建缓存堆积:多次重复构建同版本代码时,Heroku不会自动清理历史构建缓存,旧版本残留的依赖、临时构建文件都会持续占用slug体积,返回的重复构建版本提示也说明当前构建复用了旧缓存。
- 构建脚本残留:如果自定义构建流程包含下载大体积安装包、安装系统级编译工具的逻辑,且构建完成后没有做清理,这些临时内容会被完整保留在slug中。
可行解决方案
- 配置.slugignore过滤规则:规则写法和.gitignore一致,将所有运行时不需要的文件全部排除,常用过滤规则参考:
venv/ env/ node_modules/ __pycache__/ *.log test/ tests/ docs/ *.md .git/ local_assets/ checkpoint/ *.zip *.tar.gz - 裁剪生产依赖:明确拆分开发依赖和生产依赖,生产构建时仅安装运行必需的包;替换不必要的大体积依赖,比如轻量bot场景不要引入全量PyTorch、TensorFlow这类百兆级框架,优先选择轻量HTTP、API请求类依赖;定期清理依赖清单中从未被调用的冗余包。
- 清理Heroku端构建缓存:安装Heroku CLI后先执行
heroku plugins:install heroku-builds安装构建管理插件,再运行heroku builds:cache:purge -a 你的Heroku应用名清空所有历史构建缓存,之后重新触发构建即可排除缓存堆积的影响。 - 优化构建脚本:如果构建阶段需要临时安装编译工具、下载临时资源,在构建脚本的最后一步添加清理命令,删除安装包、临时解压目录、编译过程产生的缓存文件,避免这类内容被打包进slug。
- 大体积资源外置:如果业务确实需要用到大体积模型、媒体素材,不要将这类文件存入代码仓库直接打包,统一放置到对象存储服务,应用启动后按需拉取到临时目录使用即可。
内容的提问来源于stack exchange,提问作者kana natasha
相关产品推荐
相关产品推荐

