हमने अभी 'lib' में एक नई फ़ाइल बनाई है जिसने लोड त्रुटियों से जुड़े सिरदर्द की श्रृंखला बनाई है।असंगत "लोडरर" व्यवहार 'lib' नेमस्पेसिंग/ऑटोलोडिंग के साथ व्यवहार
/lib/response_set.rb:
module MyCompany
class ResponseSet < Array
...
end
end
/spec/lib/response_set_spec.rb
require 'spec_helper'
describe MyCompany::ResponseSet do
describe "..." do
...
end
end
Rspec में यह कल्पना चल रहा है हमें निम्नलिखित त्रुटि देता है जब वह पहली बार के लिए हो जाता है ' वर्णन करें:
/Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:492:in `load_missing_constant': Expected /Users/my_stuff/projects/my_project/lib/response_set.rb to define ResponseSet (LoadError)
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:183:in `block in const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `each'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/backward_compatibility.rb:20:in `const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-expectations-2.5.0/lib/rspec/expectations/backward_compatibility.rb:6:in `const_missing'
from /Users/my_stuff/projects/my_project/spec/lib/response_set_spec.rb:4:in `<top (required)>'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:386:in `load'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:386:in `block in load_spec_files'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:386:in `map'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:386:in `load_spec_files'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/command_line.rb:18:in `run'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/runner.rb:55:in `run_in_process'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/runner.rb:46:in `run'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/runner.rb:10:in `block in autorun'
हाउवर! हम कई अन्य फाइलों का उपयोग लंबे समय तक कर रहे हैं जिनकी समान संरचना है।
/lib/smart_set.rb
module MyCompany
class SmartSet < Array
...
end
end
और /spec/lib/smart_set_spec.rb
require 'spec_helper'
describe MyCompany::SmartSet do
describe "..." do
...
end
end
यह: उदाहरण के लिए, यहाँ एक और एक है कि ठीक काम कर रहा है, क्योंकि यह बनाया गया था है फ़ाइल में समान संरचना है लेकिन कोई समस्या नहीं है।
ResponseSet (समस्या वर्ग) स्पष्ट रूप से किसी भी कारण के कारण मुद्दों को लोड नहीं कर रहा है। रेल कंसोल में, पहली बार मैं एक बनाने के लिए प्रयास करते हैं, मैं कोई त्रुटि मिलती है, लेकिन फिर मैं एक बाद में बना सकते हैं:
Loading development environment (Rails 3.0.4)
ruby-1.9.2-p136 :001 > rs = MyCompany::ResponseSet.new
LoadError: Expected /Users/my_stuff/projects/my_project/lib/response_set.rb to define ResponseSet
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:492:in `load_missing_constant'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:183:in `block in const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `each'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:503:in `load_missing_constant'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:183:in `block in const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `each'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `const_missing'
from (irb):1
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/railties-3.0.4/lib/rails/commands/console.rb:44:in `start'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/railties-3.0.4/lib/rails/commands/console.rb:8:in `start'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/railties-3.0.4/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
ruby-1.9.2-p136 :002 > rs = MyCompany::ResponseSet.new
=> []
इसके अलावा, response_set_spec के शीर्ष पर
require 'response_set'
जोड़ने। आरबी उन परीक्षणों को चलाने की अनुमति देता है। लेकिन smart_set_spec.rb के लिए ऐसी कोई चीज़ जरूरी नहीं है।
निम्नलिखित application.rb में जगह में है:
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
config.autoload_paths += Dir["#{config.root}/app/models/**/"]
अब, मैं समझता हूँ कि रेल कैसे फ़ाइल संरचना चीजों के इन प्रकार के लिए नाम स्थान संरचना से मेल खाना चाहिए पर राय के कुछ प्रकार है, और हम पुनर्गठित किया है इस अंत में हमारे मॉड्यूल और फाइलें। यह समस्या को हल करने के लिए लगता है (हालांकि हम थोड़ी देर के लिए कुछ और अजीब लोड त्रुटियों को देख रहे थे जब हमने पूर्ण परीक्षण सूट चलाया - ये रहस्यमय तरीके से चले गए हैं)। फिर भी यहां हर कोई परेशान है और थोड़ा नाराज नहीं है कि रेल इतनी असंगत है और हम जानना चाहते हैं कि क्यों। जैसा कि आप देख सकते हैं कि दो फाइलें हैं जो नामस्थान और फ़ाइल संरचना के समान हैं, पूरी तरह से अलग तरीके से इलाज किया जा रहा है। असल में हमारे पास 'lib' के शीर्ष स्तर में लगभग दर्जन अन्य फाइलें हैं जो समान नामस्थान के साथ हैं जो कभी भी किसी भी समस्या का कारण नहीं बनती हैं। क्या कोई यह बता सकता है कि बिल्ली यहाँ क्या चल रहा है?
धन्यवाद Alexey। यह संदिग्ध लग रहा है। ऐसा लगता है कि अपवाद को उठाना मौसम 'requ_or_load' पर निर्भर होना चाहिए सफल रहा। लेकिन फिर मैं भूलभुलैया से बहुत परिचित नहीं हूं कि रेल गड़बड़ है। –
@ निक, स्पष्ट रूप से अपवाद उठाया जाता है, जब फ़ाइल लोड करने के बाद, निरंतर अभी भी परिभाषित नहीं किया जाता है। आपके मामले में, ऐसा लगता है कि फ़ाइल 'ResponseSet' को परिभाषित करने की अपेक्षा की जाती है, जबकि यह' MyCompany :: ResponseSet' को परिभाषित करता है (इस तरह यह मुझे देखता है, लेकिन मैं एक विशेषज्ञ नहीं हूं)। असंगतता सबसे अजीब बात है। क्या आप सुनिश्चित हैं कि आपने मूल समस्या को सरल नहीं बनाया है? हो सकता है कि 'MyCompany :: SmartSet' '/ lib/my_company/smart_set.rb' में है और न केवल'/lib/smart_set.rb' है? मैंने एक समान मुद्दे के बारे में [गिटहब पर एक बग रिपोर्ट] सबमिट की है (https://github.com/rails/rails/issues/2572)। – Alexey
नहीं। फाइल संरचनाएं समान थीं। हमने कुछ संभावित अंतरों की जांच करने में कुछ घंटे बिताए जिन्हें हम सोच सकते थे। प्रत्येक वर्ग (यानी गुण और विधियों) के वास्तविक कार्यान्वयन के साथ केवल अंतर ही हैं, लेकिन इनमें से कोई भी इस बात को प्रभावित नहीं करेगा कि फ़ाइलों को कैसे लोड किया जाता है! –