Heroku推送代码遇Bundler版本不一致问题求助
解决Heroku上Bundler版本不匹配的问题
我来帮你搞定这个Bundler版本不匹配的问题——你刚才执行的heroku run gem install bundler其实没法彻底解决问题,因为Heroku的dyno是临时容器,这次安装的Bundler会在dyno重启或者新实例启动时消失,得从部署流程层面来配置:
步骤1:先让本地Bundler版本和锁文件一致
首先在你的本地开发环境里,安装和Gemfile.lock里一致的Bundler版本(也就是1.16.1):
gem install bundler:1.16.1
这样本地推送代码时就不会再弹出版本不匹配的警告了。
步骤2:让Heroku部署时使用指定版本的Bundler
有两种可靠的方法来让Heroku在部署阶段就用正确的Bundler版本:
方法一:在Gemfile里指定Bundler版本
在你的Gemfile中添加一行,明确指定Bundler版本:
gem 'bundler', '1.16.1'
然后运行本地的bundle命令更新锁文件:
bundle install
最后把更新后的Gemfile和Gemfile.lock推送到Heroku:
git add Gemfile Gemfile.lock git commit -m "Specify bundler version 1.16.1" git push heroku main
方法二:通过Heroku环境变量指定版本
如果你不想修改Gemfile,可以直接设置Heroku的环境变量来指定Bundler版本:
heroku config:set BUNDLER_VERSION=1.16.1
然后重新推送代码触发部署(哪怕代码没改动,也可以用git push heroku main --force强制部署),Heroku就会在部署时自动安装指定版本的Bundler了。
为什么heroku run gem install bundler没用?
再给你解释下:heroku run是在一个临时运行的dyno里执行命令,这个dyno只是用来临时运行脚本,部署完成后启动的应用dyno不会继承这个安装的gem——Heroku的应用dyno是基于你的部署镜像创建的,只有在部署阶段安装的依赖才会被包含进去,所以必须通过上面两种方法让部署流程使用正确的Bundler版本。
内容的提问来源于stack exchange,提问作者Denis Bolomier
相关产品推荐
相关产品推荐

