如何配置Capistrano为登台和生产环境使用不同的gemset?

时间:2012-12-22 17:00:15

标签: ruby-on-rails rvm capistrano bundler

我在服务器上有两个文件,每个环境的共享目录中有一个名为rvmrc。其中包含用于生产的rvm use ree-1.8.7-2012.02@appname-production --create和用于暂存的rvm use ree-1.8.7-2012.02@appname-staging --create。这应该允许应用程序在其自己的gemset下运行,因为我已经在部署脚本中构建了一个任务,以将相应的shared/rvmrc文件链接到应用程序.rvmrc。该任务显示在我的deploy.rb示例中。

但是,我仍然需要让Bundler在部署期间使用正确的gemset。我想我可以通过使用set :rvm_ruby_string, "ree-1.8.7-2012.02@appname-#{rails_env}"动态设置rvm_ruby_string到环境的gemset来实现这一点。但是,我发现我的部署仅使用生产gemset - 即使在执行cap staging deploy时也是如此。

有关我的思考过程的详细信息,请参阅this question,如果您认为这只是一个坏主意,请点击进入。

我需要更改什么才能让我的部署根据环境使用正确的gemset?

在我的部署文件中,我所拥有的相关行(我已经删除了很多)是:

require 'rvm/capistrano'
require 'capistrano/ext/multistage'
require 'bundler/capistrano'

set :stages, %w(staging production)
set :default_stage, "staging"
set :rvm_ruby_string, "ree-1.8.7-2012.02@appname-#{rails_env}"
set :rvm_type, :system
set :bundle_without,  [:development]

namespace :deploy do
  task :rvmrc do
    run "rm #{latest_release}/.rvmrc; ln -s #{shared_path}/rvmrc #{latest_release}/.rvmrc"
  end
end

before "bundle:install", "deploy:rvmrc"

在我的production.rb文件中,我所拥有的相关行(我已经删除了很多)是:

set :branch, "master"
set :rails_env, "production"

在我的staging.rb文件中,我所拥有的相关行(我已经删除了很多)是:

set :branch, "staging"
set :rails_env, "staging"

1 个答案:

答案 0 :(得分:2)

您可以在启动应用程序时设置ruby版本和gemset。即使用rvm wrappers描述在链接中与神一起使用。没有.rvmrc符号链接杂耍需要这种方式。

即,如果您使用的是Unicorn,请创建一个包装器:

rvm use ree-1.8.7-2012.02@appname-production
rvm wrapper ree-1.8.7-2012.02@appname-production ree187prod unicorn

那给你〜.rvm / bin / ree187prod_unicorn。在启动脚本中使用它而不是独角兽。然后Unicorn将使用正确的ruby版本和gemset。