关于捆绑路径的困惑

时间:2012-02-14 21:12:47

标签: passenger bundler rack

我在DreamHost上开设了一个专用的托管帐户。我部署了一个rails应用程序。我收到了以下错误。

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不存在。但是当我用“捆绑秀”检查它时,它已经安装好了。 (实际上我做了“捆绑安装 - 部署”)

$ 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”解决了这个问题。

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

感谢。

萨姆

1 个答案:

答案 0 :(得分:0)

通常,这是您运行应用时所获得的(例如 rails服务器),而不会在命令前加上捆绑执行

当你运行捆绑安装 - 部署时,bundler从 ./ vendor / cache 获取了你的宝石,并在 ./ vendor / bundle 。从那以后,Bundler知道在哪里找到它们,但你必须通过Bundler运行应用程序。

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

不使用bundler来启动你的应用程序让rubygems根据它自己的方法满足你的应用程序的要求,这是相当随机的 - 如果你的应用程序当前运行所有相同的宝石,我会很惊讶例如,您运行测试的版本(Eek!)

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

希望这有帮助!