用于rails应用程序的Gemfile中的环境的不同ruby版本

krs*_*ung 1 ruby ruby-on-rails capistrano3

我目前正在使用capistrano 3在多个环境中部署我的rails 4应用程序.我想尝试在开发中转向ruby 2.1.2(我在stage/prod中运行2.0.0).假设我使用rbenv,是否有可能在单个Gemfile中以某种方式指定它?

我试图跟随我Gemfile但无济于事:

# Gemfile
group :development do
  ruby '2.1.2'
end

group :staging, :production do
  ruby '2.0.0'
end
Run Code Online (Sandbox Code Playgroud)

当cap部署在开发上运行时,由于感知的版本不匹配而中止.

Your Ruby version is 2.1.2, but your Gemfile specified 2.0.0
Run Code Online (Sandbox Code Playgroud)

这是它试图运行的命令.

cd /home/rails/releases/20140701151045 && ( RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.2 RAILS_ENV=development RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.2 ~/.rbenv/bin/rbenv exec bundle exec rake assets:precompile )
Run Code Online (Sandbox Code Playgroud)

非常感谢您的想法.谢谢!


更新 从@toolz输入并查看捆绑代码后,这是不可能的(或者一个好主意).有几种选择:

  1. 从Gemfile中删除"ruby"条目(一切顺利)
  2. 创建单独的Gemfiles
  3. 为移动到新的Ruby版本创建一个单独的分支

我选择#3选项,它将解决我的问题,似乎是最好的做法.

too*_*olz 5

我做到了这一点

Gemfile

if ENV["RAILS_ENV"] == "development"
  ruby '2.0.0'
elsif ENV["RAILS_ENV"] == "production"
  ruby '2.1.0'
end
Run Code Online (Sandbox Code Playgroud)

然后假设您正在使用rvm,您将必须创建一个capistrano任务

rvm use 2.1.0

在生产上

  • 我想,另一种选择就是使用单独的gemfiles.为什么要尝试在生产服务器上部署开发呢?另外,我会说我已经看到了一些与你类似的问题,普遍的共识似乎是这只是不好的做法.我会考虑克隆项目并在单独的ruby版本下开发.我无法想象你想要使用这两个版本进行大量开发的任何情况. (2认同)