【问题标题】:Confusion about bundler path关于捆绑器路径的困惑
【发布时间】:2012-03-06 06:08:23
【问题描述】:

我在 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”检查它时,它已经安装好了。 (其实我做了“bundle install --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”即可解决问题。

但是为什么乘客会选择系统的 rack gem(或用户的 rack gem)而不是 bundle 的 rack gem?你如何避免这个问题?

谢谢。

山姆

【问题讨论】:

  • 我尝试安装 Rack 1.3.6 但对我不起作用。还是说“已经激活 rack 1.2.1”。

标签: passenger bundler rack


【解决方案1】:

通常这是您在运行应用程序(例如 rails server)时得到的结果,而不用在命令前加上 bundle exec

当您运行 bundle install --deployment 时,bundler 会从 ./vendor/cache 中获取您的 gem,然后将它们放入 ./vendor/bundle强>。从那时起,Bundler 知道在哪里可以找到它们,但您必须通过 Bundler 运行应用程序。

但是,Rubygems 不知道这些 gem 在哪里,这就是为什么当您运行 ruby​​gems 命令 gem list 时它们不会显示的原因。当您使用 ruby​​gems 安装 Rack 1.3.6 时,rubygems 很自然地找到了它并且您的应用程序开始工作。

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

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

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多