Nicht initialisierte Konstante ActiveSupport :: Dependencies :: Mutex (NameError)

238

Wenn ich ein Ruby on Rails-Projekt erstellen möchte, wird die folgende Meldung angezeigt.

/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

Was ist schief gelaufen? Wie kann ich das Problem beheben?

Sokmesa Khiev
quelle
Können Sie die Ausgabe von posten gem --version?
Andrew Marshall

Antworten:

137

Dies ist eine Inkompatibilität zwischen Rails 2.3.8 und neueren Versionen von RubyGems. Upgrade auf die neueste Version 2.3 (2.3.11 ab heute).

John
quelle
211

Für den Fall, dass Sie kein Upgrade auf Ruby on Rails 2.3.11 durchführen können (und um die Antwort von Douglas zu erweitern), threadmuss oben auf erforderlich sein boot.rb. Beispielsweise:

require 'thread'

# Don't change this file!
# Configure your app in config/environment.rb and config/environments/*.rb
...
Aaron
quelle
28
Es ist noch einfacher, es oben hinzuzufügen boot.rb.
Nathanvda
12
Das Hinzufügen zu boot.rb sollte eigentlich die richtige Antwort sein.
Radiospiel
1
Wie füge ich den erforderlichen Thread hinzu? In welcher Datei? Ich meine, es wurde kein Schienenprojekt erstellt. Ist es die Veränderung im Kern?
Alfizqu
@alfizqu, die Datei ist<RUBYDIR>/lib/ruby/gems/<VERSION>/gems/rails-<VERSION>/environments/boot.rb
JellicleCat
Ich habe es zu config / boot.rb hinzugefügt, aber es hat bei mir nicht funktioniert. Wo muss ich es hinzufügen?
Amrit Dhungana
158

Ich konnte dies beheben, indem ich RubyGems auf 1.5.3 herunterstufte, da dies bei RubyGems 1.6.0+ und Rails <2.3.11 der Fall ist:

gem update --system 1.5.3

Wenn Sie zuvor ein Downgrade auf eine noch frühere Version durchgeführt haben und auf 1.5.3 aktualisieren möchten, wird beim Versuch, dies auszuführen, möglicherweise Folgendes angezeigt:

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

Wenn Sie diesen Fehler erhalten, aktualisieren Sie ihn, damit Sie die Version angeben können, und führen Sie dann ein Downgrade durch:

gem update --system
gem update --system 1.5.3
Gary S. Weaver
quelle
2
Hatte Probleme beim Ausführen einer 2.3.5-Rails-App, nachdem Rails 3 + Rubygems 1.6+ vorhanden war. Das hat es gelöst, danke.
RoR
4
Es funktioniert nicht für mich ... undefined local variable or method version_requirements for #<Rails::GemDependency:0x2b001603fe30>
Ray301
Danke dir! Arbeite auch für mich:]
mr.pppoe
4
@aaron du hast meine Antwort bearbeitet, um sudo vor den Befehlen hinzuzufügen, aber afaik sudo ist nicht immer angemessen (wie bei Verwendung von rvm usw.). Die Leute können es nach Bedarf hinzufügen.
Gary S. Weaver
5
oder wenn Sie rvm verwenden (ideal, wenn Sie zurückgehen und alte Codebasen unterstützen müssen!): rvm rubygems 1.5.3
verspätet
35

Sie können dieses Problem wahrscheinlich auch umgehen, indem Sie in Ihrer Anwendung als solche "Thread" benötigen:

require 'thread'

Gemäß dem RubyGems 1.6.0 Release Notes .

Douglasr
quelle
24

Wenn Sie Ihre Version beibehalten möchten, wird Rails 2.3.8 und Gem Version die neueste Version sein. Sie können diese Lösung Neuestes Juwel mit Rails2.x verwenden . in diesem einige Änderungen in der Datei boot.rb und der Datei environment.rb.

require 'thread'in der Datei boot.rb oben.

Fügen Sie in der Datei environment.rb den folgenden Code über dem Initialisierungsblock hinzu.

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
arunagw
quelle
4
Danke, dies ist die einzige Lösung, die es für mich getan hat.
Christopher Pickslay
11

Ich habe dieses Problem in vielen Fällen festgestellt, als ich versuchte, ein altes Rails 2.3.5-Projekt zu starten, nachdem ich mit Rails 3> gearbeitet hatte. In meinem Fall muss ich zur Lösung des Problems ein Rubygems-Update auf Version 1.4.2 durchführen. Dies ist:

sudo gem update --system 1.4.2
Tania R.
quelle
Dies ist die beste Lösung für uns, da sich die Rails-Version nicht ändern kann.
Ian Vaughan
6

Wenn Sie Radiant CMS verwenden, fügen Sie einfach hinzu

require 'thread'

an die Spitze von config/boot.rb.

(Ein großes Lob an die Antworten von Aaron und Nathanvda.)

thekingoftruth
quelle
3

Wie bereits erwähnt, tritt dies auf, wenn RubyGems 1.6.0 mit einer früheren Ruby on Rails-Version als Version 3 verwendet wird. Meine App verwendet Ruby on Rails 2.3.3, das in den / Anbieter des Projekts übertragen wurde.

Zweifellos kann ein Upgrade von Ruby on Rails auf eine neuere Version 2.3.X auch dieses Problem beheben. Dieses Problem verhindert jedoch, dass Sie Rake ausführen, um Ruby on Rails freizugeben und zu aktualisieren.

Das Hinzufügen von require 'thread' oben in der Umgebung.rb hat das Problem für mich nicht behoben. Das Hinzufügen von require 'thread' zu /vendor/rails/activesupport/lib/active_support.rb hat das Problem behoben.

Paul Grayson
quelle
3

Versuchen Sie, Ihre Ruby on Rails-Version auf Version 3.0.5 zu aktualisieren:

gem install rails --version 3.0.5

oder v2.3.11:

gem install rails --version 2.3.11

Wenn dies kein neues Projekt ist, müssen Sie Ihre Anwendung entsprechend aktualisieren. Wenn es sich um ein neues Projekt handelt, löschen Sie einfach das Verzeichnis, in dem Sie es erstellt haben, und erstellen Sie erneut ein neues Projekt.

Andrew Marshall
quelle
1

Aktualisieren Sie die Rubygems

gem update --system

Vishnu Atrai
quelle
-1

Ich poste meine Lösung für die anderen Seelen mit Schlafmangel da draußen:

Wenn Sie RVM verwenden, überprüfen Sie anhand der richtigen Ruby-Version und des richtigen Gemset, ob Sie sich im richtigen Ordner befinden. Ich hatte eine Reihe von Terminal-Registerkarten geöffnet, und eine davon befand sich in einem anderen Verzeichnis. Die Eingabe von "Rails Console" verursachte den Fehler, da meine Standard-Rails-Distribution 2.3.x ist.

Ich bemerkte den Fehler meinerseits, legte eine CD in das richtige Verzeichnis und meine .rvmrc-Datei erledigte den Rest.

RVM ist nicht wie Git. In git ändert sich das Ändern von Zweigen in einer Shell überall. Es geht buchstäblich darum, die fraglichen Dateien neu zu schreiben. RVM hingegen legt nur Shell-Variablen fest und muss für jede neue Shell festgelegt werden, die Sie öffnen.

Falls Sie mit .rvmrc nicht vertraut sind, können Sie eine Datei mit diesem Namen in ein beliebiges Verzeichnis einfügen. Rvm nimmt sie auf und verwendet die darin angegebene Version / Gemset, wenn Sie in dieses Verzeichnis wechseln. Hier ist ein Beispiel für eine .rvmrc-Datei:

rvm use 1.9.2@turtles

Dadurch wird auf die neueste Version von Ruby 1.9.2 in Ihrer RVM-Sammlung umgeschaltet, wobei das Gemset "Turtles" verwendet wird. Jetzt können Sie im Terminal hundert Registerkarten öffnen (wie ich es am Ende tue) und sich keine Sorgen mehr über die Ruby-Version machen, auf die es zeigt.

Jaime Bellmyer
quelle