【问题标题】:Uninitialized constant ActiveSupport::Dependencies::Mutex (NameError)未初始化的常量 ActiveSupport::Dependencies::Mutex (NameError)
【发布时间】:2011-07-07 19:13:16
【问题描述】:

当我想创建一个 Ruby on Rails 项目时,我收到以下消息。

/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:55: uninitialized constant ActiveSupport::Dependencies::Mutex (NameError)
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
    from /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support.rb:57
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
    from /usr/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails_generator.rb:31
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
    from /usr/lib/ruby/gems/1.8/gems/rails-2.3.8/bin/rails:15
    from /usr/bin/rails:19:in `load'
    from /usr/bin/rails:19

出了什么问题?我该如何解决?

【问题讨论】:

  • 你能发布gem --version的输出吗?

标签: ruby-on-rails rubygems compatibility


【解决方案1】:

如果你想保持你的版本一样,rails 将是 2.3.8,gem 版本将是最新的。您可以使用此解决方案Latest gem with Rails2.x。在此对 boot.rb 文件和 environment.rb 文件进行了一些更改。

require 'thread' 在 boot.rb 文件的顶部。

并在 environment.rb 文件中的初始化块上方添加以下代码。

if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.3.7')
 module Rails
   class GemDependency
     def requirement
       r = super
       (r == Gem::Requirement.default) ? nil : r
     end
   end
 end
end

【讨论】:

  • 谢谢,这是为我完成的唯一解决方案。
【解决方案2】:

更新红宝石

宝石更新--系统

【讨论】:

    【解决方案3】:

    如果您无法升级到 Ruby on Rails 2.3.11(并扩展 douglasr 的答案),thread 必须位于 boot.rb 的顶部。例如:

    require 'thread'
    
    # Don't change this file!
    # Configure your app in config/environment.rb and config/environments/*.rb
    ...
    

    【讨论】:

    • boot.rb本身的顶部添加它更容易。
    • 将它添加到 boot.rb 实际上应该是正确的答案。
    • 如何添加 require 线程?在哪个文件中?我的意思是,没有创建 rails 项目。是核心的变化吗?
    • @alfizqu,文件是<RUBYDIR>/lib/ruby/gems/<VERSION>/gems/rails-<VERSION>/environments/boot.rb
    • 我已将它添加到 config/boot.rb 但它对我不起作用。我必须在哪里添加它?。
    【解决方案4】:

    尝试将您的 Ruby on Rails 版本更新到 v3.0.5:

    gem install rails --version 3.0.5
    

    或 v2.3.11:

    gem install rails --version 2.3.11
    

    如果这不是一个新项目,您必须相应地升级您的应用程序。如果是一个新项目,只需删除你创建它的目录,然后重新创建一个新项目。

    【讨论】:

      【解决方案5】:

      当我在使用 rails 3 后尝试启动一个旧的 rails 2.3.5 项目时,我在很多情况下都遇到过这个问题>。就我而言,要解决问题,我必须将 ruby​​gems 更新到 1.4.2 版本,这是:

      sudo gem update --system 1.4.2
      

      【讨论】:

      • 这对我们来说是最好的解决方案,因为 rails 版本无法更改,更新涉及太多,但是更改 gem 版本,又好又容易!
      【解决方案6】:

      我正在为其他睡眠不足的人发布我的解决方案:

      如果您使用的是 RVM,请使用正确的 ruby​​ 版本和 gemset 仔细检查您是否位于正确的文件夹中。我打开了一系列终端选项卡,其中一个位于不同的目录中。输入“rails console”会产生错误,因为我的默认 rails 发行版是 2.3.x。

      我注意到了我的错误,cd 到了正确的目录,然后我的 .rvmrc 文件完成了剩下的工作。

      RVM 像 Git。在 git 中,在一个 shell 中更改分支会在任何地方更改它。它实际上是在重写有问题的文件。另一方面,RVM 只是设置 shell 变量,并且必须为您打开的每个新 shell 设置。

      如果您不熟悉 .rvmrc,您可以将具有该名称的文件放在任何目录中,并且 rvm 会在您切换到该目录时提取并使用其中指定的版本/gemset。这是一个示例 .rvmrc 文件:

      rvm use 1.9.2@turtles
      

      这将使用 gemset“turtles”切换到 RVM 集合中的最新版本 ruby​​ 1.9.2。现在您可以在终端中打开一百个选项卡(就像我最终所做的那样),而不必担心它指向的 ruby​​ 版本。

      【讨论】:

        【解决方案7】:

        我可以通过将 RubyGems 降级到 1.5.3 来解决这个问题,因为它发生在 RubyGems 1.6.0+ 和 Rails

        gem update --system 1.5.3
        

        如果您之前已降级到更早的版本并希望更新到 1.5.3,则在尝试运行该版本时可能会收到以下信息:

        Updating RubyGems
        ERROR:  While executing gem ... (RuntimeError)
            No gem names are allowed with the --system option
        

        如果您收到该错误,请更新,以便您指定版本,然后再次降级:

        gem update --system
        gem update --system 1.5.3
        

        【讨论】:

        • 在使用 rails 3 + Rubygems 1.6+ 后运行 2.3.5 rails 应用程序出现问题。这解决了,谢谢。
        • 它对我不起作用...undefined local variable or method version_requirements for #<Rails::GemDependency:0x2b001603fe30>
        • 谢谢!也为我工作:]
        • @aaron 您编辑了我的答案以在命令前面添加 sudo,但 afaik sudo 并不总是合适的(例如在使用 rvm 时等)。人们可以根据需要添加它。
        • 或者如果您使用的是 rvm(在需要返回并支持旧代码库时非常理想!):rvm ruby​​gems 1.5.3
        【解决方案8】:

        如果您使用 Radiant CMS,只需添加

        require 'thread'
        

        config/boot.rb的顶部。

        (感谢 Aaron 和 nathanvda 的回答。)

        【讨论】:

          【解决方案9】:

          如前所述,当使用 RubyGems 1.6.0 和 Ruby on Rails 版本 3 之前的版本时会发生这种情况。我的应用程序使用的是项目的 /vendor 中提供的 Ruby on Rails 2.3.3。

          毫无疑问,将 Ruby on Rails 升级到更新的 2.3.X 版本也可以解决这个问题。但是,此问题会阻止您运行 Rake 以取消供应商 Ruby on Rails 并对其进行升级。

          在 environment.rb 顶部添加 require 'thread' 并没有解决我的问题。将 require 'thread' 添加到 /vendor/rails/activesupport/lib/active_support.rb 确实解决了问题。

          【讨论】:

            【解决方案10】:

            您也可以通过在应用程序中要求“线程”来解决此问题:

            require 'thread'
            

            根据 RubyGems 1.6.0 release notes

            【讨论】:

              【解决方案11】:

              这是 Rails 2.3.8 与 RubyGems 最新版本之间的不兼容问题。升级到最新的 2.3 版本(截至今天为 2.3.11)。

              【讨论】:

                猜你喜欢
                • 2011-07-30
                • 2011-12-13
                • 2011-07-09
                • 2012-01-21
                • 1970-01-01
                • 2022-11-03
                • 1970-01-01
                • 1970-01-01
                • 2011-10-14
                相关资源
                最近更新 更多