2011-11-19 39 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'