bundler / capistrano没有使用正确的ruby版本安装gem

时间:2012-11-13 14:42:49

标签: gem ruby-on-rails-3.2 rvm capistrano

我尝试在使用Capistrano的服务器上部署我的第一个应用程序,而且我在管理gemsets和ruby版本时有点丢失了。

这些是我的(服务器和工作站)版本:

  • Rails 3.2.8
  • RVM 1.16.17
  • 宝石1.8.24
  • Bundler 1.2.1
  • pg gem 0.14.1

我的宝石是:

ruby​​-1.9.3-p194的宝石(可在/usr/local/rvm/gems/ruby-1.9.3-p194中找到)

  • (默认)
  • 全球
  • => rail3dev20120606

我将默认gemset设置为:

rvm use 1.9.3-p194@rail3dev20120606 --default --passenger

当我跑步时:

cap bundle:install

任务以成功结束,但当我这样做时:

gem list

有很多缺少的宝石,虽然它们存在于我的Gemfile中。 当我在 / var / www / opf / shared / bundle / ruby​​ / 中检查我的宝石时,我找到一个名为 1.9.1 的文件夹,并在/ var / www /中opf / shared / bundle / ruby​​ / 1.9.1 / gems /我可以喜欢我所需的所有宝石(在Gemfile中指定)。我确定ruby版本有问题,但我该如何解决?

目前,如果我执行任何rake命令,我遇到了ruby崩溃[Bug] Segmentation fault,因为它尝试访问db并使用postgresql_adapter:

/var/www/opf/shared/bundle/ruby/1.9.1/gems/activerecord-3.2.8/lib/active_record/connection_adapters/postgresql_adapter.rb:1213: [BUG] Segmentation fault

我认为由于缺少许多宝石,必须有一些未经验证的宝石依赖项,并且宝石可能正在使用不兼容的ruby版本1.9.1,尽管它期望1.9.3。

我认为问题在于管理ruby版本和宝石。我当然正在与gemset和我的capistrano部署混合。

我缺少经验和信息。 任何人都可以告诉我如何在服务器上处理这个问题?什么是最佳实践?

我想如何更新我的ruby版本?与Capistrano deploy.rb?手动?有没有rvm?我看到一个新版本的ruby 1.9.3-p327刚刚发布。

我应该使用gemset吗?那我的deploy.rb中的rvm_ruby_string怎么样?它是拼写正确还是我应该删除p194部分?我应该删除:rvm_ruby_string吗?收下 ?使用.rvmrc文件???

我真的输了,欢迎提供一些帮助。

在任何情况下,这都是我的config / deploy.rb:

require 'bundler/capistrano'
require File.join(File.dirname(__FILE__), 'deploy') + '/capistrano_database'

set :rvm_type, :system

set :rvm_ruby_string, 'ruby-1.9.3-p194@rail3dev20120606'
require 'rvm/capistrano'

set :application, 'opf'
set :deploy_to, '/var/www/opf'
set :rails_env, 'production'
set :user, 'the_user'
set :use_sudo, false

set :group_writable, false
set :scm, :git
set :repository,  'git@github.com:user/opf.git'
set :branch, 'master'

default_run_options[:pty] = true

set :deploy_via, :remote_cache

server '192.168.5.200', :web, :app, :db, :primary => true

# If you are using Passenger mod_rails uncomment this:
namespace :deploy do
  task :start do ; end
  task :stop do ; end
  task :restart, :roles => :app, :except => { :no_release => true } do
    run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
  end
end

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

安装了gem,但它们安装了bundler上下文:

bundle exec gem list

这是因为bundler将其设置存储在.bundle/config中并且没有安装共享gem,而是所有gem都安装在每个项目的单独目录中,将其视为一个inplace gemset。

答案 1 :(得分:1)

这个post帮助我理解了管理gem的两种可能性: