Costante non inizializzata ActiveSupport :: Dependencies :: Mutex (NameError)


238

Quando voglio creare un progetto Ruby on Rails, ricevo il messaggio seguente.

/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

Cosa è andato storto? Come posso ripararlo?


Puoi pubblicare l'output di gem --version?
Andrew Marshall,

Risposte:


137

Questa è un'incompatibilità tra Rails 2.3.8 e le versioni recenti di RubyGems. Esegui l'upgrade all'ultima versione 2.3 (2.3.11 ad oggi).


211

Nel caso in cui non sia possibile eseguire l'aggiornamento a Ruby on Rails 2.3.11 (e per espandere la risposta di douglasr), threaddeve essere richiesto nella parte superiore di boot.rb. Per esempio:

require 'thread'

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

28
È ancora più facile aggiungerlo nella parte superiore di boot.rbse stesso.
nathanvda,

12
L'aggiunta a boot.rb dovrebbe in realtà essere la risposta corretta.
radiospiel,

1
come aggiungo il thread richiesto? In quale file? Voglio dire, non è stato creato alcun progetto di binari. È il cambiamento nel nucleo?
alfizqu,

@alfizqu, il file è<RUBYDIR>/lib/ruby/gems/<VERSION>/gems/rails-<VERSION>/environments/boot.rb
JellicleCat il

L'ho aggiunto a config / boot.rb ma non ha funzionato per me. Dove devo aggiungerlo?
Amrit Dhungana,

158

Sono stato in grado di risolvere questo problema eseguendo il downgrade di RubyGems a 1.5.3, poiché ciò accade con RubyGems 1.6.0+ e Rails <2.3.11:

gem update --system 1.5.3

Se in precedenza era stato eseguito il downgrade a una versione ancora precedente e si desidera eseguire l'aggiornamento a 1.5.3, è possibile ottenere quanto segue quando si tenta di eseguirlo:

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

Se viene visualizzato l'errore, aggiorna, in modo che ti consenta di specificare la versione, quindi esegui nuovamente il downgrade:

gem update --system
gem update --system 1.5.3

2
Ho avuto problemi con l'esecuzione di un'app di rotaie 2.3.5 dopo aver rotaie 3 + Rubygems 1.6+. Ciò ha risolto, grazie.
RoR

4
Non funziona per me ... undefined local variable or method version_requirements for #<Rails::GemDependency:0x2b001603fe30>
Ray301,

Grazie! Lavora anche per me:]
mr.pppoe

4
@aaron hai modificato la mia risposta per aggiungere sudo davanti ai comandi, ma afaik sudo non è sempre appropriato (come quando usi rvm, ecc.). Le persone possono aggiungerlo come necessario.
Gary S. Weaver,

5
o se stai usando rvm (ideale quando devi tornare indietro e supportare vecchie basi di codice!): rvm rubygems 1.5.3
tardate

35

Probabilmente puoi anche aggirare questo problema richiedendo 'thread' nella tua applicazione in quanto tale:

require 'thread'

Secondo le note di rilascio di RubyGems 1.6.0 .


24

Se vuoi mantenere la tua versione uguale a quella delle rotaie sarà la 2.3.8 e la versione gem sarà la più recente. Puoi usare questa soluzione Ultima gemma con Rails2.x . in questo alcuni cambiamenti nel file boot.rb e nel file environment.rb.

require 'thread'nel file boot.rb in alto.

e nel file environment.rb aggiungere il seguente codice sopra il blocco di inizializzazione.

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

4
Grazie, questa è l'unica soluzione che l'ha fatto per me.
Christopher Pickslay,

11

Ho riscontrato questo problema in molte occasioni quando provo ad avviare un vecchio progetto Rails 2.3.5 dopo aver lavorato con Rails 3>. Nel mio caso per risolvere il problema, devo fare un aggiornamento rubygems alla versione 1.4.2, questo è:

sudo gem update --system 1.4.2

Questa è la soluzione migliore per noi, poiché la versione delle rotaie non può cambiare, troppo coinvolta nell'aggiornamento, ma cambiando la versione gemma, bella e facile!
Ian Vaughan,

6

Se stai usando Radiant CMS, aggiungi semplicemente

require 'thread'

alla cima di config/boot.rb .

(Complimenti alle risposte di Aaronne e Nathanvda.)


3

Come accennato, ciò si verifica quando si utilizza RubyGems 1.6.0 con la versione di Ruby on Rails precedente alla versione 3. La mia app utilizza Ruby on Rails 2.3.3 venduta nel / fornitore del progetto.

Senza dubbio anche un aggiornamento di Ruby on Rails a una versione 2.3.X più recente può risolvere questo problema. Tuttavia, questo problema impedisce di eseguire Rake sul dispositivo senza limiti Ruby su Rails e di aggiornarlo.

L'aggiunta di "thread" richiesto nella parte superiore di environment.rb non ha risolto il problema per me. L'aggiunta del "thread" richiesto a /vendor/rails/activesupport/lib/active_support.rb ha risolto il problema.


3

Prova ad aggiornare la versione di Ruby on Rails alla v3.0.5:

gem install rails --version 3.0.5

o v2.3.11:

gem install rails --version 2.3.11

Se questo non è un nuovo progetto, dovrai aggiornare la tua applicazione di conseguenza. Se era un nuovo progetto, basta eliminare la directory in cui è stato creato e creare nuovamente un nuovo progetto.



-1

Sto pubblicando la mia soluzione per le altre anime private del sonno:

Se stai usando RVM, ricontrolla di essere nella cartella corretta, usando la versione ruby ​​e il gemset corretti. Avevo una serie di schede terminali aperte e una di esse si trovava in una directory diversa. digitando "rails console" si è verificato l'errore perché la distribuzione di rails predefinita è 2.3.x.

Ho notato l'errore da parte mia, ho fatto il cd nella directory corretta e il mio file .rvmrc ha fatto il resto.

RVM non è come Git. In sostanza, cambiare i rami in una shell lo cambia ovunque. Sta letteralmente riscrivendo i file in questione. RVM, d'altra parte, sta solo impostando le variabili della shell e deve essere impostato per ogni nuova shell aperta.

Nel caso in cui non si abbia familiarità con .rvmrc, è possibile inserire un file con quel nome in qualsiasi directory e rvm lo raccoglierà e utilizzerà la versione / gemset ivi specificata, ogni volta che si passa a quella directory. Ecco un esempio di file .rvmrc:

rvm use 1.9.2@turtles

Questo passerà all'ultima versione di ruby ​​1.9.2 nella tua collezione RVM, usando le gemme "tartarughe". Ora puoi aprire un centinaio di schede nel Terminale (come finisco per fare) e non preoccuparti mai della versione ruby ​​a cui punta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.