Неініціалізована константа ActiveSupport :: Залежності :: Mutex (NameError)


238

Коли я хочу створити проект Ruby on Rails, я отримую повідомлення нижче.

/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

Що пішло не так? Як мені це виправити?


Чи можете ви розмістити вихід gem --version?
Ендрю Маршалл

Відповіді:


137

Це несумісність між Rails 2.3.8 та останніми версіями RubyGems. Оновіть до останньої версії 2.3 (2.3.11 станом на сьогодні).


211

Якщо ви не можете перейти на Ruby on Rails 2.3.11 (і розгорнути відповідь Douglasr), threadпотрібно звернутися до вершини boot.rb. Наприклад:

require 'thread'

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

28
Ще простіше додати його в самому верху boot.rb.
nathanvda

12
Додавання його до boot.rb насправді має бути правильною відповіддю.
radiospiel

1
як я додаю потрібну нитку? У якому файлі? Я маю на увазі, що проект рейки не створений. Це зміна ядра?
alfizqu

@alfizqu, файл<RUBYDIR>/lib/ruby/gems/<VERSION>/gems/rails-<VERSION>/environments/boot.rb
JellicleCat

Я додав його в config / boot.rb, але він не працює для мене. Куди мені це додати ?.
Амріт Дхунгана

158

Мені вдалося виправити це, зменшивши RubyGems до 1.5.3, оскільки це відбувається з RubyGems 1.6.0+ та Rails <2.3.11:

gem update --system 1.5.3

Якщо ви попередньо перейшли на більш ранню версію і хочете оновити до 1.5.3, ви можете отримати наступне, намагаючись запустити це:

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

Якщо ви отримаєте цю помилку, то оновіть, щоб вона дозволила вам вказати версію, а потім знову знизити її:

gem update --system
gem update --system 1.5.3

2
У вас виникли проблеми із запуском додатка для рейок 2.3.5 після наявності рейок 3 + Rubygems 1.6+. Це вирішило це, спасибі.
RoR

4
Це не працює для мене ... undefined local variable or method version_requirements for #<Rails::GemDependency:0x2b001603fe30>
Ray301

Дякую! Працюй і для мене:]
mr.pppoe

4
@aaron ви відредагували мою відповідь, щоб додати sudo перед командами, але afaik sudo не завжди підходить (як, наприклад, при використанні rvm тощо). Люди можуть додавати його в міру необхідності.
Гері С. Вівер

5
або якщо ви використовуєте rvm (ідеально, коли потрібно повертатися та підтримувати старі бази кодів!): rvm rubygems 1.5.3
tardate

35

Ви також можете скористатися цією проблемою, вимагаючи "потоку" у вашій заявці як такої:

require 'thread'

Відповідно до приміток до випуску RubyGems 1.6.0 .


24

Якщо ви хочете, щоб ваша версія була такою ж, як рейки, буде 2.3.8, а версія самоцвіту буде останньою. Ви можете використовувати це рішення Найновіший самоцвіт з Rails2.x . у цьому деякі зміни у файлі boot.rb та файлі Environment.rb.

require 'thread'у файлі boot.rb вгорі.

а у файл Environment.rb додайте наступний код над блоком ініціалізатора.

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
Дякую, це єдине рішення, яке зробило це для мене.
Крістофер Пікслі

11

Я стикався з цією проблемою в багатьох випадках, коли я намагався запустити старий проект рейки 2.3.5 після роботи з рейками 3>. У моєму випадку, щоб вирішити проблему, я повинен зробити оновлення rubygems до версії 1.4.2, це:

sudo gem update --system 1.4.2

Це найкраще рішення для нас, оскільки версія рейки не може змінитись, занадто сильно пов'язана з оновленням, але зміна версії самоцвіту, приємна і проста!
Ian Vaughan

6

Якщо ви використовуєте Radiant CMS, просто додайте

require 'thread'

до вершини config/boot.rb .

(Кудос на відповіді Аарона та Натанвди.)


3

Як згадувалося, це відбувається при використанні RubyGems 1.6.0 з версією Ruby on Rails раніше, ніж версія 3. Моя програма використовує Ruby on Rails 2.3.3, що постачається в / постачальника проекту.

Без сумніву, оновлення Ruby on Rails до нової версії 2.3.X також може вирішити цю проблему. Однак ця проблема заважає запускати Rake щоб відкрити Ruby на Rails та оновити його.

Додавання вимагає 'потоку' у верхній частині Environment.rb не вирішило проблему для мене. Додавання вимагає "потоку" в /vendor/rails/activesupport/lib/active_support.rb вирішило проблему.


3

Спробуйте оновити версію Ruby on Rails до версії 3.0:

gem install rails --version 3.0.5

або v2.3.11:

gem install rails --version 2.3.11

Якщо це не новий проект, вам доведеться відповідно оновити свою програму. Якщо це був новий проект, просто видаліть каталог, в якому ви його створили, і знову створіть новий проект.



-1

Я публікую своє рішення для інших людей, позбавлених сну:

Якщо ви використовуєте RVM, переконайтесь, що ви знаходитесь у правильній папці, використовуючи правильну версію рубіну та бездротовий набір. У мене був відкритий масив вкладок терміналів, і одна з них знаходилася в іншому каталозі. набравши "консоль рейки", виникла помилка, оскільки мій дистрибутив рейки за замовчуванням становить 2.3.x.

Я помітив помилку зі свого боку, перейшов у правильний каталог, а мій файл .rvmrc зробив все інше.

RVM не такий, як Git. У git зміна гілок в одній оболонці змінює її всюди. Це буквально переписування файлів, про які йдеться. З іншого боку, RVM - це лише встановлення змінних оболонок, і їх потрібно встановити для кожної нової оболонки, яку ви відкриєте.

У випадку, якщо ви не знайомі. Ось зразок .rvmrc-файлу:

rvm use 1.9.2@turtles

Це переключиться на останню версію ruby ​​1.9.2 у вашій колекції RVM, використовуючи "черепашки" самоцвіту. Тепер ви можете відкрити сто вкладок у Терміналі (як я закінчую) і ніколи не турбуватися про рубінову версію, на яку вказує.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.