2011-11-19 38 views
2

我有一个Rails应用程序配置为通过Capistrano和RVM进行部署。当我运行一个cap my_stage deploy(这适用于我的所有阶段),Capistrano bundle installs/var/www/my_app/shared/bundle,即使我在我的config/deploy.rb文件中指定我希望它使用[email protected]_app gemset。capistrano不会将安装捆绑到指定的gemset

这与我的预期背道而驰 - 我期望Capistrano能够部署到我的用户主目录中:~/.rvm/gems/[email protected]_gemset/gems

我做错了什么?或者是这种预期的行为。

这里是我的部署文件:

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

set :stages, %w(local development staging production) 
set :default_stage, "local" 

set :application, "My Rails App" 
set :repository, "[email protected]:MyApp/my_app.git" 

set :scm, :git 
set :deploy_to, "/var/www/my_app" 
set :use_sudo, false 
ssh_options[:keys] = [File.join(ENV["HOME"], ".ssh", "my_key.pem")] 

# RVM 
$:.unshift(File.expand_path('./lib', ENV['rvm_path'])) 
require 'rvm/capistrano'        
set :rvm_ruby_string, '[email protected]_app' 
set :rvm_type, :user 
set :user, 'my_user' 

这是我.rvmrc文件在我的Rails应用程序:

rvm_trust_rvmrc_flags=1 
rvm use [email protected]_app 

感谢, 最大

+0

获得了同样的问题,不知道跆拳道是怎么回事......我安装RVM多用户...看看这个网站:http://blog.mcmoyer.com/using-rvm-gemsets-for-部署虽然对我的情况没有帮助,但:( – hamstar

+0

最初,我非常恼火,我无法登录到生产服务器,因为RVM正在寻找'〜/中的gem,所以从部署目录运行'rake db:migrate'。 rvm/...',但Capistrano已经将它们安装到'/shared/bundle'。我通过运行'bundle exec rake db:migrate'来解决这个问题,它首先从' />加载Bundle选项。 bundle/config'。但是,我仍然想要解释这种行为。 – maxenglander

回答

3

虽然我不使用Capistrano的(我部署到Heroku,所以我需要git),我想它可能使用当前推荐的最佳实践,在产品上调用“bundle install --deployment”根据Bundler文档,在服务器上,所有gem本地安装到应用程序的部署根目录中,而不是您的GEM_HOME(在这种情况下,这将是您的RVM gemset)。当你使用“bundle install --deployment”时,你必须使用“bundle exec rake”(或bin/rake,如果你同时安装了--binstubs)才能在捆绑环境中运行Rake。

Bundler建议以这种方式部署的主要原因是为了避免部署的应用程序出现任何“依赖性地狱”的情况。虽然RVM gemset可以做同样的事情,但Bundler不会假定RVM的存在与否,它只是假设Ruby和RubyGems已经安装并运行。

当使用Bundler时,无论使用--deployment标志(甚至在开发或测试模式下的本地机器上),都始终推荐使用“bundle exec”或binstubs,这样,您可以100%确定您只取决于您的Gemfile(及其依赖关系,当然)所需的宝石,并且您不能意外部署取决于您的计算机上未部署到生产服务器的本地安装的gem的应用程序。

0

添加capistrano/rvm并设置我的红宝石版本production.rb做了一个技巧。

set :rvm_ruby_version, 'ruby-2.4.1'