gpt4 book ai didi

ruby - 如果 'require sinatra' 在另一个文件中,为什么 sinatra 不会加载?

转载 作者:数据小太阳 更新时间:2023-10-29 07:30:45 25 4
gpt4 key购买 nike

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

我在'require pp''ruby-growl' 上对其进行了测试,并且运行良好。但是如果 require sinatra 在另一个文件中,sinatra 将不会加载。

我可以在不同的文件中包含 require sinatra 吗?或者更好的是,我可以在不同的文件中要求吗?

使用

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

  • 通过 ruby script_name.rb

    从 dos 窗口运行脚本

下面是我的 requires.rb 中的几行。当我运行 web.rb 时,我可以看到文本“loading web requires”。请注意,所有 .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 文件,我可以看到“正在加载”文本,我会说某些东西正在加载或某些东西正在处理中,因为它需要一秒钟左右的时间才能完成 test.rb

测试.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

而且我无法从浏览器访问网络服务器。而且根本没有消息。嗯,有一个空行

最佳答案

当您直接使用类似 ruby my_app.rb 的东西运行 Sinatra 程序时,Sinatra 可以自动启动 Web 服务器。西纳特拉determines whether to run this built-in server by checking whether the :run setting is true .

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

西纳特拉 determines the default value for :app_file by using the first file that executes require 'sinatra' .在这种情况下,当您在 test.rb 的顶部有 require 'sinatra' 时,:app_file$0,所以 Sinatra 启动内置服务器。当你使用test_require.rb时,$0test.rb,但是需要Sinatra的文件,因此:app_file,是test_require.rb,因为它们不匹配,内置服务器没有启动。

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

set :app_file, __FILE__

在您需要 Sinatra 之后,您需要执行此操作。你也可以直接设置 :run,虽然这样不太灵活,因为它每次都会运行内置服务器,如果你使用 config.ru,你不会想要的 例如:

enable :run

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

关于ruby - 如果 'require sinatra' 在另一个文件中,为什么 sinatra 不会加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10694192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com