Niezainicjowana stała ActiveSupport :: Zależności :: Mutex (NameError)


238

Kiedy chcę utworzyć projekt Ruby on Rails, otrzymuję komunikat poniżej.

/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

Co poszło nie tak? Jak to naprawić?


Czy możesz opublikować wynik gem --version?
Andrew Marshall,

Odpowiedzi:


137

Jest to niezgodność między Railsami 2.3.8 a najnowszymi wersjami RubyGems. Uaktualnij do najnowszej wersji 2.3 (obecnie wersja 2.3.11).


211

Jeśli nie możesz uaktualnić do Ruby on Rails 2.3.11 (i rozwinąć odpowiedź Douglasra), threadmusisz go znaleźć na górze boot.rb. Na przykład:

require 'thread'

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

28
Jeszcze łatwiej jest dodać go na samej górze boot.rb.
nathanvda

12
Dodanie go do boot.rb powinno być właściwą odpowiedzią.
radiospiel,

1
jak dodać wymagany wątek? W jakim pliku? Mam na myśli, że nie stworzono projektu szynowego. Czy to zmiana rdzenia?
alfizqu

@alfizqu, plik to<RUBYDIR>/lib/ruby/gems/<VERSION>/gems/rails-<VERSION>/environments/boot.rb
JellicleCat

Dodałem go do config / boot.rb, ale to nie działa dla mnie. Gdzie muszę to dodać?
Amrit Dhungana,

158

Udało mi się to naprawić, obniżając RubyGems do 1.5.3, ponieważ dzieje się tak w RubyGems 1.6.0+ i Railsach <2.3.11:

gem update --system 1.5.3

Jeśli wcześniej dokonałeś przejścia na wcześniejszą wersję i chcesz zaktualizować do wersji 1.5.3, możesz spróbować uzyskać następujące informacje:

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

Jeśli pojawi się ten błąd, zaktualizuj, aby umożliwić określenie wersji, a następnie ponownie obniżyć wersję:

gem update --system
gem update --system 1.5.3

2
Wystąpił problem z uruchomieniem aplikacji do szyn 2.3.5 po zainstalowaniu szyn 3 + Rubygems 1.6+. To rozwiązało, dzięki.
RoR

4
Dla mnie to nie działa ... undefined local variable or method version_requirements for #<Rails::GemDependency:0x2b001603fe30>
Ray301

Dziękuję Ci! Pracuj też dla mnie:]
mr.pppoe

4
@ Aaron edytowałeś moją odpowiedź, aby dodać sudo przed poleceniami, ale afaik sudo nie zawsze jest odpowiednie (na przykład podczas korzystania z rvm itp.). Ludzie mogą dodawać go w razie potrzeby.
Gary S. Weaver,

5
lub jeśli używasz rvm (idealne, gdy musisz wrócić i obsługiwać stare bazy kodu!): rvm rubygems 1.5.3
opóźniony

35

Prawdopodobnie możesz obejść ten problem, wymagając „wątku” w aplikacji jako takiego:

require 'thread'

Jak na rubygems 1.6.0 Release Notes .


24

Jeśli chcesz zachować tę samą wersję, jak szyny, będzie 2.3.8, a wersja klejnotów będzie najnowsza. Możesz użyć tego rozwiązania Najnowszy klejnot w Rails2.x . w tym niektóre zmiany w pliku boot.rb i pliku environment.rb.

require 'thread'w pliku boot.rb u góry.

i w pliku environment.rb dodaj następujący kod powyżej bloku inicjalizującego.

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
Dzięki, to jedyne rozwiązanie, które mi to zrobiło.
Christopher Pickslay

11

Napotkałem ten problem przy wielu okazjach, kiedy próbowałem uruchomić stary projekt szyn 2.3.5 po pracy z szynami 3>. W moim przypadku, aby rozwiązać problem, muszę wykonać aktualizację Rubygems do wersji 1.4.2, to jest:

sudo gem update --system 1.4.2

Jest to dla nas najlepsze rozwiązanie, ponieważ wersja szyny nie może się zmienić, zbyt mocno zaangażowana w aktualizację tego, ale zmiana wersji klejnotu, przyjemna i łatwa!
Ian Vaughan

6

Jeśli korzystasz z Radiant CMS, po prostu dodaj

require 'thread'

na szczyt config/boot.rb.

(Uznanie dla odpowiedzi Aarona i Natanavdy).


3

Jak wspomniano, dzieje się tak podczas korzystania z RubyGems 1.6.0 z Ruby on Rails w wersji wcześniejszej niż wersja 3. Moja aplikacja używa Ruby on Rails 2.3.3 dostarczonej do / vendor projektu.

Bez wątpienia aktualizacja Ruby on Rails do nowszej wersji 2.3.X może również rozwiązać ten problem. Jednak ten problem uniemożliwia uruchomienie Rake w celu wycofania Ruby on Rails i uaktualnienia go.

Dodanie wymaga „wątku” na początku środowiska. Rb nie rozwiązało problemu dla mnie. Dodanie wymaga „wątku” do /vendor/rails/activesupport/lib/active_support.rb naprawiło problem.


3

Spróbuj zaktualizować wersję Ruby on Rails do wersji 3.0.5:

gem install rails --version 3.0.5

lub v2.3.11:

gem install rails --version 2.3.11

Jeśli nie jest to nowy projekt, musisz odpowiednio zaktualizować aplikację. Jeśli był to nowy projekt, wystarczy usunąć katalog, w którym go utworzono i ponownie utworzyć nowy projekt.



-1

Zamieszczam moje rozwiązanie dla innych dusz pozbawionych snu:

Jeśli używasz RVM, sprawdź dwukrotnie, czy jesteś w odpowiednim folderze, używając poprawnej wersji ruby ​​i zestawu gem. Miałem otwarty szereg kart terminali, a jedna z nich znajdowała się w innym katalogu. wpisanie „konsoli szyn” spowodowało błąd, ponieważ moją domyślną dystrybucją szyn jest 2.3.x.

Zauważyłem błąd z mojej strony, zapisałem cd do właściwego katalogu, a resztą zajął się mój plik .rvmrc.

RVM nie jest jak Git. W git zmiana gałęzi w jednej powłoce zmienia to wszędzie. Dosłownie przepisuje dane pliki. RVM, z drugiej strony, po prostu ustawia zmienne powłoki i musi być ustawione dla każdej nowej otwieranej powłoki.

Jeśli nie znasz .rvmrc, możesz umieścić plik o tej nazwie w dowolnym katalogu, a rvm go pobierze i użyje podanej w nim wersji / zestawu gemset za każdym razem, gdy przejdziesz do tego katalogu. Oto przykładowy plik .rvmrc:

rvm use 1.9.2@turtles

Spowoduje to przejście do najnowszej wersji Ruby 1.9.2 w Twojej kolekcji RVM, przy użyciu zestawu gemt „turtles”. Teraz możesz otworzyć sto kart w Terminalu (tak jak ja to robię) i nigdy nie martw się o wersję ruby, na którą wskazuje.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.