Heroku ruby​​版本不匹配

时间:2015-04-08 21:13:47

标签: ruby-on-rails ruby heroku

我遇到了Heroku和Rails应用程序的问题。在我的Gemfile中,我指定ruby "2.1.5",但我的应用程序崩溃了以下日志:

2015-04-08T20:54:15.248878+00:00 heroku[web.1]: Starting process with command `bin/rails server -p 57371 -e production`
2015-04-08T20:54:17.365771+00:00 app[web.1]: /app/vendor/bundle/ruby/2.1.0/gems/bundler-1.7.12/lib/bundler/definition.rb:380:in `validate_ruby!': Your Ruby version is 1.9.3, but your Gemfile specified 2.1.5 (Bundler::RubyVersionMismatch)
2015-04-08T20:54:17.365791+00:00 app[web.1]:    from /app/vendor/bundle/ruby/2.1.0/gems/bundler-1.7.12/lib/bundler.rb:118:in 'setup'

2015-04-08T20:54:17.365793+00:00 app[web.1]:    from /app/vendor/bundle/ruby/2.1.0/gems/bundler-1.7.12/lib/bundler/setup.rb:17:in 'top (required)'

2015-04-08T20:54:17.365795+00:00 app[web.1]:    from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in 'require'

2015-04-08T20:54:17.365796+00:00 app[web.1]:    from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in 'require'
2015-04-08T20:54:17.365798+00:00 app[web.1]:    from /app/config/boot.rb:3:in '<top (required)>'
2015-04-08T20:54:17.365800+00:00 app[web.1]:    from bin/rails:7:in 'require_relative'
2015-04-08T20:54:17.365802+00:00 app[web.1]:    from bin/rails:7:in <main>

2015-04-08T20:54:18.135689+00:00 heroku[web.1]: Process exited with status 1

2015-04-08T20:54:18.155346+00:00 heroku[web.1]: State changed from starting to crashed
2015-04-08T20:54:41.881395+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=....herokuapp.com request_id=1ec36521-d1ca-4ea3-b635-b79caf9b82c9 fwd="x.x.x.x" dyno= connect= service= status=503 bytes=

以下是一些奇怪的命令结果:

heroku run ruby -v: ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux] heroku run bundle install: Your Ruby version is 1.9.3, but your Gemfile specified 2.1.5 (Bundler::RubyVersionMismatch)

在将Gemfile从1.9.3切换到2.1.5之前,一切都很好。任何帮助表示赞赏。此外,它看起来不像Heroku使用rvm,所以我不知道他们是如何做他们的魔术。

编辑:我已经尝试删除该应用并从一开始就在Gemfile中创建一个版本为2.1.5的全新版本(后来2.2.0)我从同一个git repo中同步了它。

编辑2 实际上在部署时崩溃,而不仅仅是在页面服务上,以及在运行bundle(r)时。 (到目前为止)

编辑3:每次部署时,heroku都以:

开头
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.1.5
remote: -----> Installing dependencies using 1.7.12
remote:        Ruby version change detected. Clearing bundler cache.
remote:        Old: ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-linux]
remote:        New: ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
remote:        Running: bundle install --without development:test --path vendo

(旧版/新版的正确版本)

编辑4:似乎Heroku没有正确加载环境变量(或者是吗?),因此加载并使用了错误的ruby版本:

local$ heroku config -s | grep PATH
PATH=/app/vendor/ruby-2.1.5/bin:/app/vendor/bundle/ruby/2.1.0/bin:/bin:/usr/bin:/app/bin:/app/vendor/bundle/bin
local$ heroku run ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
local$ heroku run bash
heroku $ echo $PATH
/app/bin:/app/vendor/bundle/bin:/app/vendor/bundle/ruby/2.1.0    /bin:/app/vendor/ruby-2.1.5/bin:/app/vendor/bundle/ruby/2.1.0    /bin:/bin:/usr/bin:/app/bin:/app/vendor/bundle/bin
heroku $ cat .profile.d/ruby.sh | grep PATH
export GEM_PATH="$HOME/vendor/bundle/ruby/2.1.0:$GEM_PATH"
export PATH="$HOME/bin:$HOME/vendor/bundle/bin:$HOME/vendor/bundle/ruby/2.1.0/bin:$PATH"

环境正在ruby而不是/app/bin中寻找/app/vendor/ruby-2.1.5/bin。如果在Heroku环境中我export PATH得到正确的值,我可以毫无问题地运行bundle。不幸的是,似乎服务于应用程序的实例不是。

我可以更改PATH中的profile.d/ruby.sh或创建.ruby-version文件,但在heroku上既没有nano,也没有pico和vim。我该怎么办?

2 个答案:

答案 0 :(得分:3)

好吧,48小时后,我在这里找到了解决方案:other SO post

确实,我的项目中有一些剩余的垃圾,即bin文件夹。这是解决它的原因:

$ bundle config --delete bin

$ bundle exec rake rails:update:bin

所有当地人。然后推送到heroku,不要忘记包含新生成的文件。乌拉!

答案 1 :(得分:1)

在部署到Heroku时遇到了涉及ruby版本不匹配的相关问题。问题是捆绑器的冲突版本。 Heroku将每个buildpack锁定到特定版本的bundler。

要修复,请更新捆绑包gem update bundlerbundle install并再次部署。

更多信息:https://devcenter.heroku.com/articles/bundler-version