2

我在测试 Rails 应用程序时在 Ruby 控制台中发现了这个错误。

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib /mongrel.rb:285:  
in `run': Ruby threads cannot be used in RubyCocoa without patches to the Ruby interpreter

所以我想我必须修补或重新安装 RubyCocoa。但我没有找到任何内容来做到这一点。或者你可能有更好的方法来解决这个问题?

这是我的环境:

  • 红宝石 1.8.7
  • 导轨 2.3.3
  • Mac OSX 10.6
4

3 回答 3

2

快速破解:

$ RUBYCOCOA_THREAD_HOOK_DISABLE=1 ./script/server --debugger

不同的快速破解:

$ echo "ENV['RUBYCOCOA_THREAD_HOOK_DISABLE']='1'" > config/initializers/disable_rubycocoa_warning.rb
于 2010-02-15T15:08:01.747 回答
2

正如马修在他的回答中指出的那样,可能是一个插件导致了这种情况。他发现attachment_fu是一个原因。(它可以使用 Core Image 进行图像处理。)使用此行在(用于 Rails 应用程序)中创建文件config/initializers将使警告静音,但需要其他图像处理器之一:

Technoweenie::AttachmentFu.default_processors.delete('CoreImage')

这对我来说不是问题;我部署到非 Mac 服务器上,因为这些服务器不能使用 CoreImage,所以无论如何我想在开发过程中运行相同的东西。

如果您查看/System/Library/Frameworks/RubyCocoa.framework/Versions/A/Resources/ruby/osx/ objc/ruby_addition.rb,这是在文件的底部:

class Thread
  class << self
    alias :pre_rubycocoa_new :new

    # Override Thread.new to prevent threads being created if there isn't 
    # runtime support for it
    def new(*args,&block)
      unless defined? @_rubycocoa_threads_allowed then
        # If user has explicilty disabled thread support, also disable the 
        # check (for debugging/testing only)
        @_rubycocoa_threads_allowed = ENV['RUBYCOCOA_THREAD_HOOK_DISABLE'] || 
          OSX::RBRuntime.isRubyThreadingSupported?
      end
      if !@_rubycocoa_threads_allowed then
        warn "#{caller[0]}: Ruby threads cannot be used in RubyCocoa without patches to the Ruby interpreter"
      end
      pre_rubycocoa_new(*args,&block)
    end
  end
end

所以对于初学者来说,我们会收到一个警告,但它会继续调用原来Thread.new的。我不相信这个警告是一个真正的问题。在控制台中不断看到它只是很烦人。

如果您想追踪猴子补丁中的内容Thread,请使用 grep 查找拉入的内容osx/cocoa

$ irb
>> Thread.new { puts 'hi' }
hi=> #<Thread:0x1011328e0 run>
>> require 'osx/cocoa'

=> true
>> Thread.new { puts 'hi' }
(irb):3:in `irb_binding': Ruby threads cannot be used in RubyCocoa without patches to the Ruby interpreter
hi=> #<Thread:0x103bf76e8 run>
于 2010-01-27T22:07:54.800 回答
1

可能不是 mongrel 将其拉入,而是您的 rails 应用程序中的一些插件。对我来说,attachment_fu 是罪魁祸首

于 2010-01-30T00:45:07.977 回答