未初始化的常量 ActiveSupport::Dependencies::Mutex (NameError)
Posted
技术标签:
【中文标题】未初始化的常量 ActiveSupport::Dependencies::Mutex (NameError)【英文标题】:Uninitialized constant 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
的输出吗?
【参考方案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 项目时,我在很多情况下都遇到过这个问题>。就我而言,要解决问题,我必须将 rubygems 更新到 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 rubygems 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)。
【讨论】:
以上是关于未初始化的常量 ActiveSupport::Dependencies::Mutex (NameError)的主要内容,如果未能解决你的问题,请参考以下文章