Constante não inicializada ActiveSupport :: Dependencies :: Mutex (NameError)

238

Quando eu quero criar um projeto Ruby on Rails, recebo a mensagem abaixo.

/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

O que deu errado? Como faço para corrigi-lo?

Sokmesa Khiev
fonte
Você pode postar a saída de gem --version?
Andrew Marshall

Respostas:

137

Essa é uma incompatibilidade entre o Rails 2.3.8 e as versões recentes do RubyGems. Atualize para a versão 2.3 mais recente (2.3.11 a partir de hoje).

John
fonte
211

Caso você não possa atualizar para o Ruby on Rails 2.3.11 (e para expandir a resposta de douglasr), threaddeve ser necessário na parte superior boot.rb. Por exemplo:

require 'thread'

# Don't change this file!
# Configure your app in config/environment.rb and config/environments/*.rb
...
Aaron
fonte
28
É ainda mais fácil adicioná-lo à parte superior boot.rb.
Nathanvda
12
Adicioná-lo ao boot.rb deve ser a resposta correta.
Radiospiel
1
como adiciono o thread de solicitação? Em qual arquivo? Quero dizer, não há projeto de trilhos criado. É a mudança no núcleo?
alfizqu
@alfizqu, o arquivo é<RUBYDIR>/lib/ruby/gems/<VERSION>/gems/rails-<VERSION>/environments/boot.rb
JellicleCat
Eu o adicionei ao config / boot.rb, mas não funciona para mim. Onde eu tenho que adicioná-lo?
Amrit Dhungana
158

Consegui consertar isso desclassificando o RubyGems para 1.5.3, pois isso acontece com o RubyGems 1.6.0+ e o Rails <2.3.11:

gem update --system 1.5.3

Se você já havia feito o downgrade para uma versão ainda mais anterior e deseja atualizar para a 1.5.3, poderá obter o seguinte ao tentar executar isso:

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

Se você receber esse erro, atualize para permitir que você especifique a versão e faça o downgrade novamente:

gem update --system
gem update --system 1.5.3
Gary S. Weaver
fonte
2
Ocorreu um problema ao executar um aplicativo de trilhos 2.3.5 após ter trilhos 3 + Rubygems 1.6+. Isso resolveu, obrigado.
RoR
4
Não está funcionando para mim ... # undefined local variable or method version_requirements for #<Rails::GemDependency:0x2b001603fe30>
2130 Ray301
Obrigado! Trabalhe para mim também:]
mr.pppoe
4
@ Aaron, você editou minha resposta para adicionar sudo na frente dos comandos, mas o afaik sudo nem sempre é apropriado (como ao usar o rvm, etc.). As pessoas podem adicioná-lo conforme necessário.
Gary S. tecelão
5
ou se você estiver usando o rvm (ideal quando precisar voltar e oferecer suporte a antigas bases de código!): rvm rubygems 1.5.3
finalizado em
35

Você também pode solucionar esse problema exigindo 'thread' no seu aplicativo, como tal:

require 'thread'

Conforme as notas de versão do RubyGems 1.6.0 .

douglasr
fonte
24

Se você quiser manter sua versão igual à dos trilhos, será a 2.3.8 e a versão gem será a mais recente. Você pode usar esta solução Gem mais recente com o Rails2.x . neste algumas mudanças no arquivo boot.rb e no arquivo environment.rb.

require 'thread'no arquivo boot.rb na parte superior.

e no arquivo environment.rb, adicione o seguinte código acima do bloco inicializador.

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
fonte
4
Obrigado, esta é a única solução que fez isso por mim.
Christopher Pickslay
11

Eu já enfrentei esse problema em muitas ocasiões quando tento iniciar um projeto antigo do rails 2.3.5 depois de ter trabalhado com o rails 3>. No meu caso, para resolver o problema, devo fazer uma atualização de rubygems para a versão 1.4.2, isto é:

sudo gem update --system 1.4.2
Tania R
fonte
Esta é a melhor solução para nós, pois a versão rails não pode mudar, muito envolvida na atualização, mas alterar a versão gem, agradável e fácil!
Ian Vaughan
6

Se você estiver usando o Radiant CMS, basta adicionar

require 'thread'

para o topo de config/boot.rb.

(Parabéns às respostas de Aaron e nathanvda.)

thekingoftruth
fonte
3

Conforme mencionado, isso ocorre ao usar o RubyGems 1.6.0 com a versão Ruby on Rails anterior à versão 3. Meu aplicativo está usando o Ruby on Rails 2.3.3 fornecido no / vendor do projeto.

Sem dúvida, uma atualização do Ruby on Rails para uma versão mais recente do 2.3.X também pode corrigir esse problema. No entanto, esse problema impede que você execute o Rake para remover o fornecedor do Ruby on Rails e atualize-o.

A adição de require 'thread' na parte superior do environment.rb não corrigiu o problema para mim. A inclusão de require 'thread' em /vendor/rails/activesupport/lib/active_support.rb resolveu o problema.

Paul Grayson
fonte
3

Tente atualizar sua versão do Ruby on Rails para a v3.0.5:

gem install rails --version 3.0.5

ou v2.3.11:

gem install rails --version 2.3.11

Se este não for um projeto novo, você precisará atualizar seu aplicativo adequadamente. Se fosse um novo projeto, exclua o diretório em que você o criou e crie um novo projeto novamente.

Andrew Marshall
fonte
1

atualizar os rubygems

atualização de gemas - sistema

Vishnu Atrai
fonte
-1

Estou postando minha solução para as outras almas privadas de sono por aí:

Se você estiver usando RVM, verifique se está na pasta correta, usando a versão ruby ​​e o gemset corretos. Eu tinha uma variedade de abas de terminal abertas e uma delas estava em um diretório diferente. digitar "console do rails" produziu o erro porque minha distribuição padrão do rails é 2.3.x.

Percebi o erro da minha parte, cd'd para o diretório correto e meu arquivo .rvmrc fez o resto.

O RVM não é como o Git. No git, alterar ramificações em um shell altera em todos os lugares. É literalmente reescrever os arquivos em questão. O RVM, por outro lado, está apenas configurando variáveis ​​do shell e deve ser definido para cada novo shell que você abrir.

Caso você não esteja familiarizado com .rvmrc, você pode colocar um arquivo com esse nome em qualquer diretório, e o rvm o buscará e usará a versão / gemset especificada nele, sempre que você mudar para esse diretório. Aqui está um arquivo .rvmrc de exemplo:

rvm use 1.9.2@turtles

Isso mudará para a versão mais recente do ruby ​​1.9.2 na sua coleção RVM, usando o gemset "turtles". Agora você pode abrir centenas de guias no Terminal (como eu acabo fazendo) e nunca se preocupar com a versão ruby ​​que está apontando.

Jaime Bellmyer
fonte