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?

Sokmesa Khiev
sumber
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).

John
sumber
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
...
Harun
sumber
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
Gary S. Weaver
sumber
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 .

douglasr
sumber
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
arunagw
sumber
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
Tania R
sumber
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.)

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

Paul Grayson
sumber
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.

Andrew Marshall
sumber
1

perbarui rubygems

pembaruan permata --sistem

Wisnu Atrai
sumber
-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.

Jaime Bellmyer
sumber