2012-02-14 157 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來維護我的應用程序的寶石。捆綁器的美妙之處在於它可以計算出一組有效的寶石並可靠地使用它。

希望這會有所幫助!