【问题标题】:Ruby / Sinatra - Already initialized constant WFKV_Ruby / Sinatra - 已经初始化常量 WFKV_
【发布时间】:2026-02-04 14:30:01
【问题描述】:

运行 ruby​​ 1.9.2p290 和最新版本的 Sinatra。

当我尝试运行我的 Sinatra 应用程序时

  ruby application.rb 

我收到一个错误

  C:/RailsInstaller/Ruby1.9.2/lib/ruby/gems/1.9.1/gems/rack-1.3.4/lib/rack/backports/uri/common_192.rb:53: warning: already initialized constant WFKV_

我查看了Rake "already initialized constant WFKV_" warning 并尝试了修复,但没有成功。 http://localhost:4567/ 也不产生任何结果。

【问题讨论】:

    标签: ruby rubygems sinatra


    【解决方案1】:

    这将在 Rack 1.3.5 和 1.4.0 中修复。

    【讨论】:

      【解决方案2】:

      这是一个警告,而不是错误。您可以放心地忽略它,如果不编辑rack 源代码,您将无法阻止它出现。如果警告让您感到困扰,您可以随时使用 Rails 中的此方法暂时使 Ruby 静音:

      def silence_stream(stream)
        old_stream = stream.dup
        stream.reopen(RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ ? 'NUL:' : '/dev/null')
        stream.sync = true
        yield
      ensure
        stream.reopen(old_stream)
      end
      
      silence_stream(STDERR) do
        silence_stream(STDOUT) do
          require 'sinatra'
        end
      end
      
      # rest of code as usual...
      

      或者只阻止警告而不是整个 stderr 和 stdout 流:

      verbose = $VERBOSE
      $VERBOSE = nil
      require 'sinatra'
      $VERBOSE = verbose
      
      # rest of code as usual...
      

      如果这不起作用,那么您可能阻止了代码的错误部分。由于 rack 导致警告,我假设它在第一次需要 rack 时发生。这可能是通过 Sinatra 为您完成的,这就是为什么我说在需要 sinatra 期间阻止警告。您可以尝试将其余的requires 放在紧挨着require 'sinatra' 旁边的行中。

      【讨论】:

      • 无论您目前在哪里拥有include 'sinatra'(删除该行并替换为上面的代码),所以是的,我假设为 application.rb。该警告不会导致任何问题,因此您可以保持原样,但取决于您。
      • 抱歉,我不确定我在想什么 - 我的意思是 require 不是 include。已编辑以解决此问题。
      • 是的,我尝试了更新版本,但仍然没有成功。我的设置似乎有问题?
      • 刚刚更新了答案。也许 Windows 以不同的方式处理输出流重定向(尽管this answer 似乎暗示不是)。无论如何,第二种方法应该可以工作,而且更整洁。
      • 是的,没有成功,这一定是我的设置有问题。
      【解决方案3】:

      简单修复:gem 'rack' , '1.3.3' (使用以前版本的 rack 并且错误消失。)比简单的静音要好得多。

      【讨论】:

      • 这是一个坏主意,正如 this blog post concerning the warning 上的一个 cmets 中所解释的那样。你最好的选择是忽略警告。长话短说:rack 1.3.3 有一个拒绝服务攻击漏洞,1.3.4 解决了。