我有web.rb文件,工作正常。我想在一个requires.rb文件中移动所有require文件,并从我的所有.rb文件中调用此文件,并根据调用者文件名使用条件来要求所需的文件。
我在'require pp','ruby-growl'上进行了测试,并且运行正常。但如果require sinatra
在另一个档案中,则不会加载sinatra。
我可以将require sinatra
放在其他文件中吗?或者更好一般我可以在不同的文件中要求吗?
gem 1.3.7
通过ruby script_name.rb
我的requires.rb的第一行很少在下面。当我运行web.rb时,我可以看到“加载网络需要”的文字。请注意,我需要所有.rb文件的'rubygems'。如果我评论“require”sinatra',我会收到一条错误消息'web.rb:17:uninitialized constant Rack(NameError)'。如果没有注释require,ruby会在屏幕上没有任何消息的情况下完成,也没有错误消息。
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文件,我可以看到“加载”文本,我会说某些东西正在加载或者某些东西正在处理,因为它需要一秒钟左右来完成测试.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服务器。根本没有消息。嗯,有一个空行
答案 0 :(得分:5)
当您使用ruby my_app.rb
之类的东西直接运行Sinatra程序时,Sinatra可以自动启动Web服务器。 Sinatra determines whether to run this built-in server by checking whether the :run
setting is true
。
值:run
的默认值是通过检查:app_file
设置是否与正在执行的Ruby文件相同来确定的,即$0
。
Sinatra determines the default value for :app_file
by using the first file that executes require 'sinatra'
。在这种情况下,如果require 'sinatra'
位于test.rb
的顶部,则:app_file
为$0
,因此Sinatra会启动内置服务器。当您使用test_require.rb
时,$0
为test.rb
,但要求Sinatra的文件:app_file
为test_require.rb
,因为它们不匹配内置服务器未启动。
要解决此问题,您可以在:app_file
(或test.rb
或任何地方)明确设置web.rb
:
set :app_file, __FILE__
你需要Sinatra。你也可以直接设置:run
,虽然这样会不那么灵活,因为每次都会运行内置服务器,如果你使用config.ru
就不会想要这样:
enable :run
虽然这可以解决您的问题,但我个人认为最好将require 'sinatra'
与Sinatra代码保持在一起。