4

我已经安装了 sinatra gem irb,如果我输入,

require 'sinatra'

它返回true

但是当我这样做时

rackup -d config.ru

它告诉我

nil
Exception `LoadError' at /usr/local/lib/ruby/1.9.1/rubygems/custom_require.rb:36 - cannot load such file -- sinatra

这是我的config.ru

require './app'

set :environment, ENV['RACK_ENV'].to_sym
set :app_file,     'app.rb'
disable :run

run Sinatra::Application

app.rb

require 'rubygems'
require 'sinatra'

get '' do
   'Hello World'
end

我不知道出了什么问题。


$ which ruby
/usr/local/bin/ruby
$ which rackup
/usr/local/bin/rackup
$ ruby -v
ruby 1.9.3p374 (2013-01-15 revision 38858) [x86_64-linux]
$ rackup -v
Rack 1.2 (Release: 1.5)
4

3 回答 3

2

我认为这只是设置-d选项的详细输出。服务器是否实际启动(在产生大量输出之后)?

正在发生的事情是这样的。使用-d将 Ruby 的$DEBUG标志设置为true. 然后,Rack 尝试通过 加载应用程序config.ru,然后加载您的app.rb. 中的第一件事app.rbrequire 'sinatra'

Rubygems 用require自己的方法替换了原来的方法。当您调用require它时,它会尝试使用现有的加载路径和原始require方法正常加载文件。如果尚未加载 gem,这将引发 LoadError,Rubygems在加载 gem 之前会捕获该错误。

设置$DEBUG标志后,即使异常已被抢救和处理,Ruby 也会在引发异常时生成消息,这就是您所看到的。

-d为了避免这种情况,只需在您的调用中省略标志rackup(也许启用警告-w会为您提供足够详细的输出,而不会让您陷入太多细节)。

如果服务器没有启动,那么这将是一个不同的问题,而不是找不到 Sinatra。如果是这种情况,您需要检查输出的其余部分以获取线索。

(请注意,我最初认为发生了其他事情,这就是我在他的评论中提出的问题。)

于 2013-02-04T00:09:57.000 回答
0

这绝对是加载路径的问题。无论如何尝试通过RVM和 Bundler 设置所需的 ruby​​ 和 gems。它确保 Ruby 解释器和加载路径是一致的。

于 2014-05-13T08:51:46.997 回答
0

我的猜测是你的 rackup 脚本是一个安装在 diff ruby​​1.9x vm 中的“rack”gem 的 binstub

可能是 ruby​​1.9.2 的早期版本,所以它看不到安装的 sinatra

我会在命令行上尝试“which rackup”

于 2013-07-05T18:47:02.443 回答