我有一个Rails应用程序,配置为通过Capistrano和RVM进行部署。当我运行cap my_stage deploy
(这适用于我的所有阶段)时,Capistrano bundle installs
到/var/www/my_app/shared/bundle
,即使我已在我的config/deploy.rb
文件中指定我希望它使用1.9.2@my_app
宝石集。
这与我的期望相反 - 我希望Capistrano能够部署到我用户的主目录中:~/.rvm/gems/ruby-1.9.2-p290@my_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, "git@github.com: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, '1.9.2@my_app'
set :rvm_type, :user
set :user, 'my_user'
以下是我的Rails应用中的.rvmrc
文件:
rvm_trust_rvmrc_flags=1
rvm use 1.9.2@my_app
谢谢, 最大
答案 0 :(得分:3)
虽然我不使用Capistrano(我部署到Heroku,所以我只需要git),我想它可能会使用当前推荐的最佳做法,即在生产服务器上调用“bundle install --deployment”根据Bundler文档,将所有gems本地安装到应用程序的部署根目录而不是GEM_HOME(在这种情况下,这将是您的RVM gemset)。当你使用“bundle install --deployment”时,你必须使用“bundle exec rake”(或bin / rake,如果你还安装了--binstubs)在捆绑环境中运行Rake。
Bundler建议以这种方式部署的主要原因是避免在部署的应用程序中出现任何“依赖地狱”情况。虽然RVM gemset也做同样的事情,但Bundler并不假设是否存在RVM,它只假设Ruby和RubyGems已经安装并正常工作。
使用Bundler时,总是建议使用“bundle exec”或binstubs而不管--deployment标志(即使在开发或测试模式下的本地机器上),这样你就可以100%肯定你了。仅依赖于Gemfile所需的gem(当然还有它们的依赖项),并且您不会意外地部署依赖于未部署到生产服务器的计算机上任何本地安装的gem的应用程序。
答案 1 :(得分:0)
添加capistrano/rvm
并在production.rb
中设置我的ruby版本就可以了。
set :rvm_ruby_version, 'ruby-2.4.1'