求助:Rails应用部署Heroku失败,devise 4.5.0版本不可用
这种情况我之前部署Rails应用时也碰到过——明明本地跑起来没问题、同版本的其他应用也能正常部署,偏偏这个应用在Heroku上就报Devise版本找不到的错。大概率是Gem源索引同步问题或者本地bundle缓存异常,给你几个靠谱的排查和解决步骤:
1. 确认Gemfile的源配置
Devise是托管在rubygems.org上的,先检查你的Gemfile开头是否包含官方源:
source 'https://rubygems.org'
如果你的Gemfile里同时配置了rails-assets.org这类第三方源,可能会干扰Bundler查找包的顺序。可以暂时注释掉rails-assets的源,重新执行bundle install后再尝试推送。
2. 清除本地Bundle缓存并重新安装
本地的bundle缓存可能存储了损坏的版本索引,导致推送时Heroku拉取失败。执行以下命令清理缓存并重新生成依赖:
bundle clean --force bundle install
完成后,提交更新后的Gemfile.lock文件,再重新推送到Heroku。
3. 保守更新Devise到可用版本
如果Devise 4.5.0确实被作者从源上移除了(虽然其他应用能跑可能是因为旧的lock文件还保留着历史索引),可以用保守更新命令,只更新Devise到同主版本下的可用版本,不会影响其他依赖:
bundle update devise --conservative
这个命令会找到4.5.x系列中还存在的最新版本,更新Gemfile.lock后再提交推送。
4. 检查Heroku的Bundler配置
有时候Heroku的环境变量可能设置了自定义的Gem源,导致拉取失败。用命令查看当前配置:
heroku config
如果看到BUNDLE_SOURCE这类异常的环境变量,执行以下命令删除:
heroku config:unset BUNDLE_SOURCE
之后再重新推送应用。
为什么其他同版本应用没问题?
那些能正常部署的应用,它们的Gemfile.lock是在Devise 4.5.0还能正常被源索引到的时候生成的,Heroku会直接根据lock文件里的校验信息拉取包;而你现在的应用可能是在源索引更新后重新生成了lock文件,导致找不到对应版本。
内容的提问来源于stack exchange,提问作者Eric

