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?


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).


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
...

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

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 .


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

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

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.)


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.


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.



-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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.