Hằng số chưa được khởi động ActiveSupport :: Dependencies :: Mutex (NameError)


238

Khi tôi muốn tạo một dự án Ruby on Rails, tôi nhận được thông báo bên dưới.

/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

Điều gì đã đi sai? Làm thế nào để tôi sửa nó?


Bạn có thể gửi đầu ra của gem --version?
Andrew Marshall

Câu trả lời:


137

Đây là sự không tương thích giữa Rails 2.3.8 và các phiên bản gần đây của RubyGems. Nâng cấp lên phiên bản 2.3 mới nhất (2.3.11 tính đến hôm nay).


211

Trong trường hợp bạn không thể nâng cấp lên Ruby on Rails 2.3.11 (và để mở rộng theo câu trả lời của douecraftr), threadphải được yêu cầu ở đầu boot.rb. Ví dụ:

require 'thread'

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

28
Nó thậm chí còn dễ dàng hơn để thêm nó ở đầu của boot.rbchính nó.
nathanvda

12
Thêm nó vào boot.rb thực sự nên là câu trả lời thích hợp.
radiospiel

1
Làm thế nào tôi thêm chủ đề yêu cầu? Trong tập tin nào? Ý tôi là, không có dự án đường ray nào được tạo ra. Có phải đó là sự thay đổi trong cốt lõi?
alfizqu

@alfizqu, tập tin là<RUBYDIR>/lib/ruby/gems/<VERSION>/gems/rails-<VERSION>/environments/boot.rb
JellicleCat

Tôi đã thêm nó vào config / boot.rb nhưng nó không hoạt động với tôi. Tôi phải thêm nó vào đâu?
Amrit Dhungana

158

Tôi đã có thể khắc phục điều này bằng cách hạ cấp RubyGems xuống 1.5.3, vì nó xảy ra với RubyGems 1.6.0+ và Rails <2.3.11:

gem update --system 1.5.3

Nếu trước đây bạn đã hạ cấp xuống phiên bản thậm chí sớm hơn và muốn cập nhật lên 1.5.3, bạn có thể nhận được những điều sau đây khi cố gắng chạy phiên bản đó:

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

Nếu bạn gặp lỗi đó, sau đó cập nhật, để nó cho phép bạn chỉ định phiên bản, sau đó hạ cấp lại:

gem update --system
gem update --system 1.5.3

2
Có vấn đề với việc chạy ứng dụng 2.3.5 rails sau khi có rails 3 + Rubygems 1.6+. Điều này đã giải quyết nó, cảm ơn.
RoR

4
Nó không hoạt động đối với tôi ... undefined local variable or method version_requirements for #<Rails::GemDependency:0x2b001603fe30>
Ray602

Cảm ơn bạn! Làm việc cho tôi cũng vậy:]
mr.pppoe

4
@aaron bạn đã chỉnh sửa câu trả lời của tôi để thêm sudo trước các lệnh, nhưng afaik sudo không phải lúc nào cũng thích hợp (như khi sử dụng rvm, v.v.). Mọi người có thể thêm nó vào khi cần thiết.
Gary S. Weaver

5
hoặc nếu bạn đang sử dụng rvm (lý tưởng khi cần quay lại và hỗ trợ các cơ sở mã cũ!): rvm rubygems 1.5.3
tardate

35

Bạn cũng có thể khắc phục vấn đề này bằng cách yêu cầu 'luồng' trong ứng dụng của mình như sau:

require 'thread'

Theo ghi chú phát hành RubyGems 1.6.0 .


24

Nếu bạn muốn giữ phiên bản của mình giống như đường ray sẽ là 2.3.8 và phiên bản đá quý sẽ là mới nhất. Bạn có thể sử dụng giải pháp này Đá quý mới nhất với Rails2.x . trong đó một số thay đổi trong tệp boot.rb và tệp môi trường.rb.

require 'thread'trong tệp boot.rb ở đầu.

và trong tệp môi trường.rb thêm mã sau vào khối khởi tạo.

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
Cảm ơn, đây là giải pháp duy nhất đã làm điều đó cho tôi.
Christopher Pickslay

11

Tôi đã phải đối mặt với vấn đề này trong nhiều lần khi tôi cố gắng bắt đầu một dự án đường ray cũ 2.3.5 sau khi đã làm việc với đường ray 3>. Trong trường hợp của tôi để giải quyết vấn đề, tôi phải thực hiện cập nhật rubygems lên phiên bản 1.4.2, đây là:

sudo gem update --system 1.4.2

Đây là giải pháp tốt nhất cho chúng tôi, vì phiên bản đường ray không thể thay đổi, liên quan quá nhiều đến việc cập nhật điều đó, nhưng thay đổi phiên bản đá quý, rất hay và dễ dàng!
Ian Vaughan

6

Nếu bạn đang sử dụng Radiant CMS, chỉ cần thêm

require 'thread'

lên đỉnh config/boot.rb.

(Kudos cho câu trả lời của Aaron và nathanvda.)


3

Như đã đề cập, điều này xảy ra khi sử dụng RubyGems 1.6.0 với phiên bản Ruby on Rails sớm hơn phiên bản 3. Ứng dụng của tôi đang sử dụng Ruby on Rails 2.3.3 được chuyển vào / nhà cung cấp của dự án.

Không nghi ngờ gì việc nâng cấp Ruby on Rails lên phiên bản 2.3.X mới hơn cũng có thể khắc phục vấn đề này. Tuy nhiên, sự cố này ngăn bạn chạy Rake để tiết lộ Ruby on Rails và nâng cấp nó.

Việc thêm yêu cầu 'luồng' vào đầu môi trường.rb không khắc phục được sự cố cho tôi. Việc thêm yêu cầu 'chủ đề' vào /vendor/rails/activesupport/lib/active_support.rb đã khắc phục sự cố.


3

Hãy thử cập nhật phiên bản Ruby on Rails của bạn lên v3.0.5:

gem install rails --version 3.0.5

hoặc v2.3.11:

gem install rails --version 2.3.11

Nếu đây không phải là một dự án mới, bạn sẽ phải nâng cấp ứng dụng của mình cho phù hợp. Nếu đó là một dự án mới, chỉ cần xóa thư mục bạn đã tạo và tạo lại một dự án mới.



-1

Tôi đang đăng giải pháp của mình cho những linh hồn bị mất ngủ khác ngoài kia:

Nếu bạn đang sử dụng RVM, hãy kiểm tra kỹ xem bạn có đang ở đúng thư mục không, sử dụng đúng phiên bản ruby ​​và đá quý. Tôi đã mở một loạt các tab thiết bị đầu cuối và một trong số chúng nằm trong một thư mục khác. gõ "rails console" tạo ra lỗi vì distro rails mặc định của tôi là 2.3.x.

Tôi nhận thấy lỗi từ phía tôi, cd'd vào đúng thư mục và tệp .rvmrc của tôi đã làm phần còn lại.

RVM không giống như Git. Trong git, thay đổi các nhánh trong một vỏ thay đổi nó ở khắp mọi nơi. Đó là nghĩa đen viết lại các tập tin trong câu hỏi. RVM, mặt khác, chỉ thiết lập các biến shell và phải được đặt cho mỗi shell mới mà bạn mở.

Trong trường hợp bạn không quen thuộc với .rvmrc, bạn có thể đặt một tệp có tên đó vào bất kỳ thư mục nào và rvm sẽ chọn nó và sử dụng phiên bản / gemet được chỉ định trong đó, bất cứ khi nào bạn thay đổi thư mục đó. Đây là một tệp .rvmrc mẫu:

rvm use 1.9.2@turtles

Điều này sẽ chuyển sang phiên bản ruby ​​1.9.2 mới nhất trong bộ sưu tập RVM của bạn, sử dụng "rùa" đá quý. Bây giờ bạn có thể mở ra một trăm tab trong Terminal (khi tôi kết thúc) và không bao giờ lo lắng về phiên bản ruby ​​mà nó đang trỏ tới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.