Gem 不会通过 config.ru 加载

Posted

技术标签:

【中文标题】Gem 不会通过 config.ru 加载【英文标题】:Gem does not load over config.ru 【发布时间】:2013-04-17 17:06:03 【问题描述】:

我有自己的宝石“RocketRuby”。我将它加载到 irb 中,它可以加载它。在早期版本中,我的 config.ru 中也有它,并且它有效。

现在我再次编译并再次安装它。然后(它仍然可以通过将其加载到 irb 中)乘客崩溃并告诉我:

cannot load such file -- rocketruby (LoadError)
  /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:60:in `require'
  /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:60:in `rescue in require'
  /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:35:in `require'
  config.ru:1:in `block in <main>'
  /var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/builder.rb:55:in `instance_eval'
  /var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/builder.rb:55:in `initialize'
  config.ru:1:in `new'
  config.ru:1:in `<main>'
  /var/lib/gems/1.9.1/gems/passenger-4.0.0.rc6/helper-scripts/rack-preloader.rb:82:in `eval'
  /var/lib/gems/1.9.1/gems/passenger-4.0.0.rc6/helper-scripts/rack-preloader.rb:82:in `preload_app'
  /var/lib/gems/1.9.1/gems/passenger-4.0.0.rc6/helper-scripts/rack-preloader.rb:127:in `<module:App>'
  /var/lib/gems/1.9.1/gems/passenger-4.0.0.rc6/helper-scripts/rack-preloader.rb:6:in `<module:PhusionPassenger>'
  /var/lib/gems/1.9.1/gems/passenger-4.0.0.rc6/helper-scripts/rack-preloader.rb:5:in `<main>'

config.ru 如下所示:

require "rocketruby"
require "./shop_of_one.rb"

ShopOfOne.instance

run RocketRuby::RackApplication.new

非常奇怪的是,虽然出现此错误,但在 irb require "rocketruby" 中仍然有效。

有什么帮助吗?

【问题讨论】:

您的应用程序以什么用户身份运行?您可以在 Phusion 乘客错误页面中看到这一点。正在运行的用户是您所期望的吗?还要检查那个错误页面上的 Ruby 加载路径。是你所期望的吗? 【参考方案1】:

Passenger 以它自己的用户身份运行,即使是它所加载的 apache 用户也不共享环境。这意味着您的 gem 在尝试运行时可能没有安装。

使用 bundler 可以解决这个问题,我相信还有其他方法,但是添加一个 Gemfile,运行 bundle install --deployment 并添加这个:

require 'rubygems'
require 'bundler'

Bundler.require

到您的机架应用程序的顶部将解决问题。

【讨论】:

以上是关于Gem 不会通过 config.ru 加载的主要内容,如果未能解决你的问题,请参考以下文章

从gem内部访问一个类

需要 taglib-ruby 时加载错误

Gemfile分平台加载gem

Gem::LoadError 为数据库适配器指定了 'mysql2',但是 gem 没有加载

LoadError:无法加载“听”gem(Rails 5)

无法安装 gem - 无法构建 gem 本机扩展 - 无法加载此类文件 - mkmf (LoadError)