ActiveSupport konstan yang tidak diinisialisasi :: Ketergantungan :: Mutex (NameError)


238

Ketika saya ingin membuat proyek Ruby on Rails, saya mendapatkan pesan di bawah ini.

/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

Apa yang salah? Bagaimana cara memperbaikinya?


Bisakah Anda memposting output gem --version?
Andrew Marshall

Jawaban:


137

Ini adalah ketidakcocokan antara Rails 2.3.8 dan versi terbaru dari RubyGems. Tingkatkan ke versi 2.3 terbaru (2.3.11 pada hari ini).


211

Jika Anda tidak dapat meningkatkan ke Ruby on Rails 2.3.11 (dan untuk memperluas jawaban douglasr), threadharus diminta di bagian atas boot.rb. Sebagai contoh:

require 'thread'

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

28
Bahkan lebih mudah untuk menambahkannya di atas boot.rbitu sendiri.
nathanvda

12
Menambahkannya ke boot.rb seharusnya menjadi jawaban yang tepat.
radiospiel

1
bagaimana saya menambahkan utas yang diperlukan? Di file mana? Maksud saya, tidak ada proyek rel yang dibuat. Apakah ini perubahan inti?
alfizqu

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

Saya telah menambahkannya ke config / boot.rb tetapi tidak berfungsi untuk saya. Di mana saya harus menambahkannya?
Amrit Dhungana

158

Saya dapat memperbaiki ini dengan menurunkan RubyGems ke 1.5.3, karena itu terjadi dengan RubyGems 1.6.0+ dan Rails <2.3.11:

gem update --system 1.5.3

Jika sebelumnya Anda telah menurunkan versi ke versi yang lebih awal dan ingin memperbarui ke 1.5.3, Anda mungkin mendapatkan yang berikut ketika mencoba menjalankannya:

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

Jika Anda mendapatkan kesalahan itu, maka perbarui, sehingga memungkinkan Anda menentukan versi, dan kemudian turunkan lagi:

gem update --system
gem update --system 1.5.3

2
Punya masalah dengan menjalankan aplikasi rel 2.3.5 setelah memiliki rel 3 + Rubygems 1.6+. Ini menyelesaikannya, terima kasih.
RoR

4
Ini tidak bekerja untuk saya ... undefined local variable or method version_requirements for #<Rails::GemDependency:0x2b001603fe30>
Ray301

Terima kasih! Bekerja untuk saya juga:]
mr.pppoe

4
@ Harun Anda mengedit jawaban saya untuk menambahkan sudo di depan perintah, tetapi afaik sudo tidak selalu tepat (seperti saat menggunakan rvm, dll.). Orang dapat menambahkannya sesuai kebutuhan.
Gary S. Weaver

5
atau jika Anda menggunakan rvm (ideal saat harus kembali dan mendukung basis kode lama!): rvm rubygems 1.5.3
tardate

35

Anda juga dapat mengatasi masalah ini dengan meminta 'utas' di aplikasi Anda seperti:

require 'thread'

Sesuai dengan catatan rilis RubyGems 1.6.0 .


24

Jika Anda ingin menjaga versi Anda sama seperti rel akan 2.3.8 dan versi permata akan terbaru. Anda dapat menggunakan solusi ini Permata terbaru dengan Rails2.x . dalam hal ini beberapa perubahan pada file boot.rb dan file environment.rb.

require 'thread'di file boot.rb di bagian atas.

dan di file environment.rb tambahkan kode berikut di atas blok initializer.

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
Terima kasih, ini adalah satu-satunya solusi yang melakukannya untuk saya.
Christopher Pickslay

11

Saya telah menghadapi masalah ini di banyak kesempatan ketika saya mencoba untuk memulai proyek rel 2.3.5 lama setelah bekerja dengan rel 3>. Dalam kasus saya untuk menyelesaikan masalah, saya harus melakukan pembaruan rubygems ke versi 1.4.2, ini adalah:

sudo gem update --system 1.4.2

Ini adalah solusi terbaik bagi kami, karena versi rel tidak dapat berubah, terlalu banyak terlibat dengan memperbarui itu, tetapi mengubah versi permata, bagus dan mudah!
Ian Vaughan

6

Jika Anda menggunakan Radiant CMS, cukup tambahkan

require 'thread'

ke atas config/boot.rb.

(Kudos untuk tanggapan Harun dan nathanvda.)


3

Seperti yang disebutkan ini terjadi ketika menggunakan RubyGems 1.6.0 dengan Ruby on Rails versi lebih awal dari versi 3. Aplikasi saya menggunakan Ruby on Rails 2.3.3 dibatalkan ke / vendor proyek.

Tidak diragukan lagi peningkatan Ruby on Rails ke versi 2.3.X yang lebih baru juga dapat memperbaiki masalah ini. Namun, masalah ini mencegah Anda menjalankan Rake untuk membatalkan Ruby on Rails dan memutakhirkannya.

Menambahkan memerlukan 'utas' ke atas environment.rb tidak memperbaiki masalah bagi saya. Menambahkan membutuhkan 'utas' ke /vendor/rails/activesupport/lib/active_support.rb memang memperbaiki masalah.


3

Coba perbarui versi Ruby on Rails Anda ke v3.0.5:

gem install rails --version 3.0.5

atau v2.3.11:

gem install rails --version 2.3.11

Jika ini bukan proyek baru Anda harus memutakhirkan aplikasi Anda. Jika itu adalah proyek baru, hapus saja direktori tempat Anda membuatnya dan buat proyek baru lagi.



-1

Saya memposting solusi saya untuk jiwa-jiwa yang kurang tidur di luar sana:

Jika Anda menggunakan RVM, periksa kembali apakah Anda berada di folder yang benar, menggunakan versi ruby ​​dan permata yang benar. Saya memiliki array tab terminal terbuka, dan salah satunya ada di direktori yang berbeda. mengetikkan "rails console" menghasilkan kesalahan karena distro rail default saya adalah 2.3.x.

Saya melihat kesalahan pada bagian saya, cd ke direktori yang benar, dan file .rvmrc saya melakukan sisanya.

RVM tidak seperti Git. Dalam git, mengubah cabang dalam satu shell akan mengubahnya di mana-mana. Secara harfiah menulis ulang file yang dimaksud. RVM, di sisi lain, hanya mengatur variabel shell, dan harus ditetapkan untuk setiap shell baru yang Anda buka.

Jika Anda tidak terbiasa dengan .rvmrc, Anda dapat meletakkan file dengan nama itu di direktori mana pun, dan rvm akan mengambilnya dan menggunakan versi / gemset yang ditentukan di dalamnya, setiap kali Anda mengubah ke direktori itu. Berikut ini contoh file .rvmrc:

rvm use 1.9.2@turtles

Ini akan beralih ke ruby ​​1.9.2 versi terbaru dalam koleksi RVM Anda, menggunakan "turtles" permata. Sekarang Anda dapat membuka seratus tab di Terminal (seperti yang saya lakukan pada akhirnya) dan tidak pernah khawatir tentang versi ruby ​​yang ditunjuknya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.