Constante non initialisée ActiveSupport :: Dependencies :: Mutex (NameError)

238

Lorsque je veux créer un projet Ruby on Rails, je reçois le message ci-dessous.

/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

Qu'est-ce qui a mal tourné? Comment puis-je le réparer?

Sokmesa Khiev
la source
Pouvez-vous publier la sortie de gem --version?
Andrew Marshall

Réponses:

137

Il s'agit d'une incompatibilité entre Rails 2.3.8 et les versions récentes de RubyGems. Mettez à niveau vers la dernière version 2.3 (2.3.11 à partir d'aujourd'hui).

John
la source
211

Dans le cas où vous ne pouvez pas passer à Ruby on Rails 2.3.11 (et étendre la réponse de douglasr), threaddoit être requis en haut de boot.rb. Par exemple:

require 'thread'

# Don't change this file!
# Configure your app in config/environment.rb and config/environments/*.rb
...
Aaron
la source
28
Il est encore plus facile de l'ajouter en haut de boot.rblui - même.
nathanvda
12
L'ajouter à boot.rb devrait en fait être la bonne réponse.
radiospiel
1
comment ajouter le thread requis? Dans quel dossier? Je veux dire, il n'y a pas de projet de rails créé. Est-ce le changement dans le noyau?
alfizqu
@alfizqu, le fichier est<RUBYDIR>/lib/ruby/gems/<VERSION>/gems/rails-<VERSION>/environments/boot.rb
JellicleCat
Je l'ai ajouté à config / boot.rb mais cela ne fonctionne pas pour moi. Où dois-je l'ajouter?.
Amrit Dhungana
158

J'ai pu résoudre ce problème en rétrogradant RubyGems à 1.5.3, car cela se produit avec RubyGems 1.6.0+ et Rails <2.3.11:

gem update --system 1.5.3

Si vous aviez précédemment rétrogradé vers une version encore plus ancienne et que vous souhaitez mettre à jour vers 1.5.3, vous pourriez obtenir ce qui suit lorsque vous essayez de l'exécuter:

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

Si vous obtenez cette erreur, mettez-la à jour, afin qu'elle vous permette de spécifier la version, puis rétrogradez à nouveau:

gem update --system
gem update --system 1.5.3
Gary S. Weaver
la source
2
Nous avons eu un problème avec l'exécution d'une application de rails 2.3.5 après avoir eu les rails 3 + Rubygems 1.6+. Cela l'a résolu, merci.
RoR
4
Ça ne marche pas pour moi ... undefined local variable or method version_requirements for #<Rails::GemDependency:0x2b001603fe30>
Ray301
Je vous remercie! Travaille pour moi aussi:]
mr.pppoe
4
@aaron vous avez modifié ma réponse pour ajouter sudo devant les commandes, mais afaik sudo n'est pas toujours approprié (comme lors de l'utilisation de rvm, etc.). Les gens peuvent l'ajouter au besoin.
Gary S. Weaver
5
ou si vous utilisez rvm (idéal lorsque vous devez revenir en arrière et prendre en charge d'anciennes bases de code!): rvm rubygems 1.5.3
tard
35

Vous pouvez également contourner ce problème en exigeant un «thread» dans votre application en tant que tel:

require 'thread'

Selon les notes de version de RubyGems 1.6.0 .

douglasr
la source
24

Si vous voulez garder votre version identique, les rails seront 2.3.8 et la version gem sera la plus récente. Vous pouvez utiliser cette solution Latest gem avec Rails2.x . dans ce quelques modifications dans le fichier boot.rb et le fichier environment.rb.

require 'thread'dans le fichier boot.rb en haut.

et dans le fichier environment.rb, ajoutez le code suivant au-dessus du bloc d'initialisation.

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
la source
4
Merci, c'est la seule solution qui l'a fait pour moi.
Christopher Pickslay
11

J'ai rencontré ce problème à plusieurs reprises lorsque j'essaie de démarrer un ancien projet de rails 2.3.5 après avoir travaillé avec les rails 3>. Dans mon cas pour résoudre le problème, je dois faire une mise à jour rubygems vers la version 1.4.2, c'est:

sudo gem update --system 1.4.2
Tania R
la source
C'est la meilleure solution pour nous, car la version des rails ne peut pas changer, trop impliquée dans la mise à jour, mais changer la version gem, facile et facile!
Ian Vaughan
6

Si vous utilisez Radiant CMS, ajoutez simplement

require 'thread'

au sommet de config/boot.rb.

(Bravo aux réponses d'Aaron et de nathanvda.)

thekingoftruth
la source
3

Comme mentionné, cela se produit lors de l'utilisation de RubyGems 1.6.0 avec la version Ruby on Rails antérieure à la version 3. Mon application utilise Ruby on Rails 2.3.3 vendue dans le / vendeur du projet.

Une mise à niveau de Ruby on Rails vers une version 2.3.X plus récente peut également résoudre ce problème. Cependant, ce problème vous empêche d'exécuter Rake pour supprimer Ruby on Rails et de le mettre à niveau.

L'ajout de "thread" en haut d'environnement.rb n'a pas résolu le problème pour moi. L'ajout de «thread» requis à /vendor/rails/activesupport/lib/active_support.rb a résolu le problème.

Paul Grayson
la source
3

Essayez de mettre à jour votre version de Ruby on Rails vers la v3.0.5:

gem install rails --version 3.0.5

ou v2.3.11:

gem install rails --version 2.3.11

S'il ne s'agit pas d'un nouveau projet, vous devrez mettre à niveau votre application en conséquence. S'il s'agissait d'un nouveau projet, supprimez simplement le répertoire dans lequel vous l'avez créé et créez à nouveau un nouveau projet.

Andrew Marshall
la source
1

mettre à jour les rubygèmes

mise à jour de gemme - système

Vishnu Atrai
la source
-1

Je poste ma solution pour les autres âmes privées de sommeil:

Si vous utilisez RVM, vérifiez que vous êtes dans le bon dossier, en utilisant la version rubis et le jeu de gemmes corrects. J'avais ouvert un tableau d'onglets de terminal, et l'un d'eux était dans un répertoire différent. taper "rails console" a produit l'erreur car ma distribution de rails par défaut est 2.3.x.

J'ai remarqué l'erreur de ma part, cd'd dans le bon répertoire, et mon fichier .rvmrc a fait le reste.

RVM n'est pas comme Git. Dans git, changer les branches dans un shell le change partout. C'est réécrire littéralement les fichiers en question. RVM, d'autre part, ne fait que définir des variables de shell, et doit être défini pour chaque nouveau shell que vous ouvrez.

Dans le cas où vous n'êtes pas familier avec .rvmrc, vous pouvez mettre un fichier avec ce nom dans n'importe quel répertoire, et rvm le récupérera et utilisera la version / gemset qui y est spécifiée, chaque fois que vous passez dans ce répertoire. Voici un exemple de fichier .rvmrc:

rvm use 1.9.2@turtles

Cela passera à la dernière version de ruby ​​1.9.2 dans votre collection RVM, en utilisant le jeu de gemmes "tortues". Maintenant, vous pouvez ouvrir une centaine d'onglets dans Terminal (comme je finis par le faire) et ne jamais vous soucier de la version ruby ​​vers laquelle il pointe.

Jaime Bellmyer
la source