Ruby 为什么西纳特拉获胜';如果';需要sinatra';在另一个文件中吗?

Ruby 为什么西纳特拉获胜';如果';需要sinatra';在另一个文件中吗?,ruby,require,Ruby,Require,我有一个web.rb文件,可以正常工作。我想将所有require文件移动到一个requires.rb文件中,并从我的所有.rb文件调用此文件,并使用基于调用方文件名的条件来请求所需的内容 我在'requirepp'和'ruby-growl'上测试了它,效果很好。但是如果require sinatra在另一个文件中,sinatra将不会加载 我可以将require sinatra放在不同的文件中吗?或者更好,一般来说,我可以在不同的文件中有要求吗 使用 ruby 1.8.7(2010-08-16

我有一个web.rb文件,可以正常工作。我想将所有require文件移动到一个requires.rb文件中,并从我的所有.rb文件调用此文件,并使用基于调用方文件名的条件来请求所需的内容

我在'requirepp''ruby-growl'上测试了它,效果很好。但是如果
require sinatra
在另一个文件中,sinatra将不会加载

我可以将
require sinatra
放在不同的文件中吗?或者更好,一般来说,我可以在不同的文件中有要求吗

使用

  • ruby 1.8.7(2010-08-16补丁级别302)[i386-mingw32]
  • 西纳特拉(1.3.2)
  • 创业板1.3.7

  • 通过
    ruby script\u name.rb从dos窗口运行脚本

下面是my requires.rb中的几行。当我运行web.rb时,我可以看到文本“LoadingWebrequires”。请注意,我要求所有.rb文件都使用“rubygems”。如果我注释'require'sinatra',我会收到一条错误消息'web.rb:17:uninitialized constant Rack(namererror)'。如果require没有被注释,屏幕上没有任何消息,也没有错误消息

called_from=caller[0].split(":")[0]
puts "loading web 'requires' for file: #{called_from} ..." if (["web"].any?{|s| called_from[s]})

require "c:\\edutester\\others\\settings.rb"

require 'rubygems'
require 'sinatra'           if (["web"].any?{|s| called_from[s]}) 
更新 我简化了测试用例。我有两个文件。如果我只在文件中使用test.rb和require。一切正常。如果我使用test_require.rb文件,我可以看到“正在加载”文本,我会说有东西正在加载或正在处理,因为完成test.rb需要一秒钟左右的时间

test.rb

#require "c:\\edutester\\playground\\test_require.rb"

require 'rubygems' 
require 'sinatra'


get '/' do

    "yes"
end
和test_require.rb

puts "loading..."
require 'rubygems' 
require 'sinatra'


Sinatra不会加载=我没有得到通常的

== Sinatra/1.3.2 has taken the stage on 4567 for development with backup from Thin 
>> Thin web server (v1.2.7 codename No Hup) 
>> Maximum connections set to 1024 
>> Listening on 0.0.0.0:4567, CTRL+C to stop 

我无法从浏览器访问web服务器。而且根本没有任何信息。嗯,当你直接用ruby my_app.rb之类的东西运行Sinatra程序时,有一行空行,Sinatra可以自动启动web服务器。西纳特拉

:run
的默认值是通过检查
:app_file
设置是否与正在执行的Ruby文件相同来确定的,即
$0

西纳特拉。在这种情况下,如果在
test.rb的顶部有
require'sinatra'
,则
:app_file
$0
,因此sinatra启动内置服务器。当您使用
test\u require.rb
时,
$0
test.rb
,但是需要Sinatra的文件和前面的
:app\u file
test\u require.rb
,并且由于它们与内置服务器不匹配,因此不会启动

要解决此问题,您可以在
test.rb
(或
web.rb
或任何位置)中显式设置
:app_file

set:app\u文件,\u文件__
在你需要Sinatra之后,你需要这样做。您也可以直接设置
:run
,但这样做的灵活性较低,因为每次都会运行内置服务器,如果您使用
config.ru
,则不希望这样做,例如:

启用:运行

虽然这可以解决您的问题,但我个人认为最好将
require'sinatra'
与sinatra代码一起保存。

从另一个文件中请求应该可以。您是否首先
需要rubygems
?是的,我确实需要对所有.rb文件使用rubygems。我用更多信息更新了我的问题。你能澄清一下“sinatra不会加载”是什么意思吗?我假设您的意思是请求失败,并显示错误消息。Sinatra不会加载=我没有得到通常的
==Sinatra/1.3.2已在4567上进行开发,使用瘦web服务器备份(v1.2.7 codename No Hup)>>最大连接设置为1024>>侦听0.0.0.0:4567,CTRL+C停止
,我无法从浏览器访问web服务器。而且根本没有任何信息。HM,有一个空行…考虑使用BUBER而不是手动需要的东西。