2012-02-14 160 views
0

我在DreamHost上打开了一个专用的托管帐户。我部署了一个轨道应用程序。我得到了以下错误。关于捆绑器路径的困惑

You have already activated rack 1.2.1, but your Gemfile requires rack 1.3.6. Using bundle exec may solve this. 

我检查了版本。

$ gem list -d rack 

rack (1.2.1, 1.1.0, 1.0.1, 1.0.0) 
    Author: Christian Neukirchen 
    Rubyforge: http://rubyforge.org/projects/rack 
    Homepage: http://rack.rubyforge.org 
    Installed at (1.2.1): /usr/lib/ruby/gems/1.8 
       (1.1.0): /usr/lib/ruby/gems/1.8 
       (1.0.1): /usr/lib/ruby/gems/1.8 
       (1.0.0): /usr/lib/ruby/gems/1.8 

机架1.3.6不存在。但是当我用“捆绑秀”检查它时,它已经安装了。 (其实我没有 “捆绑安装--deployment”)

$ bundle show rack 
/.../my_rails_app_root/vendor/bundle/ruby/1.8/gems/rack-1.3.6 

而且我的config/setup_load_paths.rb

if ENV['MY_RUBY_HOME'] && ENV['MY_RUBY_HOME'].include?('rvm') 
    begin 
    rvm_path  = File.dirname(File.dirname(ENV['MY_RUBY_HOME'])) 
    rvm_lib_path = File.join(rvm_path, 'lib') 
    $LOAD_PATH.unshift rvm_lib_path 
    require 'rvm' 
    RVM.use_from_path! File.dirname(File.dirname(__FILE__)) 
    rescue LoadError 
    # RVM is unavailable at this point. 
    raise "RVM ruby lib is currently unavailable." 
    end 
end 

ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', File.dirname(__FILE__)) 
require 'bundler/setup' 

其实我找到了解决办法。只需“gem install rack -v 1.3.6”即可解决问题。

但为什么乘客拿起系统的机架宝石(或用户的机架宝石),而不是捆绑的机架宝石?你如何避免这个问题?

谢谢。

山姆

+0

我试过安装Rack 1.3.6,那对我没有用。它仍然在说它“已经启动机架1.2.1”。 – mysmallidea 2012-02-25 19:37:33

回答

0

这通常是当你不使用束EXEC前缀的命令来运行你的应用程序(例如轨服务器)你会得到什么。

当你跑捆绑安装--deployment,捆绑了你的宝石从./vendor/cache./vendor/bundle他们疲惫不堪。从那时起,Bundler知道在哪里可以找到它们,但是你必须通过Bundler运行应用程序。

但是,Rubygems不知道这些宝石的位置,这就是为什么当您运行rubygems命令宝石列表时它们不会显示。当您使用rubygems安装Rack 1.3.6时,rubygems自然会发现它,并且您的应用程序开始工作。

不使用捆绑程序来启动您的应用程序可以让rubygems根据自己的方法满足您的应用程序的要求,而且这是相当随机的 - 如果您的应用程序当前运行的是与您相同的所有gem版本, (Eek!)

我通常采取的方法是卸载全部从服务器的宝石,安装单一版本的rubygems和bundler,然后完全依赖Bundler来维护我的应用程序的宝石。捆绑器的美妙之处在于它可以计算出一组有效的宝石并可靠地使用它。

希望这会有所帮助!