Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रूबी जेम्स को समझना: वे कैसे काम करते हैं और उनका समस्या निवारण कैसे करें

अधिकांश समय, रूबी में जेम्स बस काम करते हैं। लेकिन रूबी जादू के साथ एक बड़ी समस्या है: जब चीजें गलत हो जाती हैं, तो यह पता लगाना कठिन होता है कि क्यों।

आप अक्सर अपने जेम्स के साथ समस्याओं में नहीं पड़ेंगे। लेकिन जब आप करते हैं, तो गूगल आश्चर्यजनक रूप से अनुपयोगी है। त्रुटि संदेश सामान्य हैं, इसलिए उनके कई अलग-अलग कारण हो सकते हैं। और यदि आप नहीं समझते कि जेम्स वास्तव में रूबी के साथ कैसे काम करते हैं, तो आप इन समस्याओं को अपने दम पर डीबग करने में कठिन समय व्यतीत करेंगे।

जेम्स जादुई लग सकते हैं। लेकिन थोड़ी जांच के साथ, उन्हें समझना काफी आसान है।

gem install क्या करता है?

एक रूबी जेम बस थोड़े अतिरिक्त डेटा के साथ ज़िप किया गया कुछ कोड है। आप gem unpack के साथ जेम के अंदर का कोड देख सकते हैं:

~/Source/playground jweiss$ gem unpack resque_unit
Fetching: resque_unit-0.4.8.gem (100%)
Unpacked gem: '/Users/jweiss/Source/playground/resque_unit-0.4.8'
~/Source/playground jweiss$ cd resque_unit-0.4.8
~/Source/playground/resque_unit-0.4.8 jweiss$ find .
.
./lib
./lib/resque_unit
./lib/resque_unit/assertions.rb
./lib/resque_unit/errors.rb
./lib/resque_unit/helpers.rb
./lib/resque_unit/plugin.rb
./lib/resque_unit/resque.rb
./lib/resque_unit/scheduler.rb
./lib/resque_unit/scheduler_assertions.rb
./lib/resque_unit.rb
./lib/resque_unit_scheduler.rb
./README.md
./test
./test/resque_test.rb
./test/resque_unit_scheduler_test.rb
./test/resque_unit_test.rb
./test/sample_jobs.rb
./test/test_helper.rb
~/Source/playground/resque_unit-0.4.8 jweiss$

gem install, अपने सरलतम रूप में, ऐसा कुछ करता है। यह जेम को पकड़ता है और इसकी फाइलों को आपके सिस्टम पर एक विशेष डायरेक्टरी में डालता है। आप देख सकते हैं कि gem install आपके जेम्स को कहां इंस्टॉल करेगा यदि आप gem environment चलाते हैं (INSTALLATION DIRECTORY: लाइन देखें):

~ jweiss$ gem environment
RubyGems Environment:
- RUBYGEMS VERSION: 2.2.2
- RUBY VERSION: 2.1.2 (2014-05-08 patchlevel 95) [x86_64-darwin14.0]
- INSTALLATION DIRECTORY: /usr/local/Cellar/ruby/2.1.2/lib/ruby/gems/2.1.0
...
~ jweiss$ ls /usr/local/Cellar/ruby/2.1.2/lib/ruby/gems/2.1.0
bin bundler doc gems build_info cache extensions specifications

आपके सभी इंस्टॉल किए गए जेम कोड वहां होंगे, gems डायरेक्टरी के तहत।

ये पथ सिस्टम से सिस्टम में भिन्न होते हैं, और वे इस पर भी निर्भर करते हैं कि आपने रूबी कैसे इंस्टॉल किया (rvm होमब्रू से अलग है, जो rbenv से अलग है, और इसी तरह)। इसलिए जब आप जानना चाहते हैं कि आपके जेम्स का कोड कहां रहता है तो gem environment मददगार होगा।

जेम कोड कैसे रिक्वायर होता है?

आपको अपने जेम्स के अंदर कोड का उपयोग करने में मदद करने के लिए, रूबीजेम्स रूबी के require मेथड को ओवरराइड करता है। (यह इसे core_ext/kernel_require.rb में करता है)। टिप्पणी काफी स्पष्ट है:

core_ext/kernel_require.rb
 ##
 # When RubyGems is required, Kernel#require is replaced with our own which
 # is capable of loading gems on demand.
 #
 # When you call <tt>require 'x'</tt>, this is what happens:
 # * If the file can be loaded from the existing Ruby loadpath, it
 # is.
 # * Otherwise, installed gems are searched for a file that matches.
 # If it's found in gem 'y', that gem is activated (added to the
 # loadpath).
 #

उदाहरण के लिए, मान लें कि आप active_support लोड करना चाहते थे। रूबीजेम्स रूबी के require मेथड का उपयोग करके इसे रिक्वायर करने का प्रयास करेगा। यह आपको यह त्रुटि देता है:

LoadError: cannot load such file -- active_support
from (irb):17:in `require'
from (irb):17
from /usr/local/bin/irb:11:in `
'

रूबीजेम्स उस त्रुटि संदेश को देखता है, और देखता है कि उसे active_support.rb को एक जेम के अंदर ढूंढना होगा, बजाय इसके। ऐसा करने के लिए, यह अपने जेम्स के मेटाडेटा के माध्यम से स्कैन करेगा, एक ऐसे जेम की तलाश में जिसमें active_support.rb हो:

irb(main):001:0> spec = Gem::Specification.find_by_path('active_support')
=> #<Gem::Specification:0x3fe366874324 activesupport-4.2.0.beta1>

फिर, यह जेम को सक्रिय करता है, जो जेम के अंदर कोड को रूबी के लोड पथ में जोड़ता है (वे डायरेक्टरी जिनसे आप फाइलें require कर सकते हैं):

irb(main):002:0> $LOAD_PATH
=> ["/usr/local/Cellar/ruby/2.1.2/lib/ruby/site_ruby/2.1.0", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/site_ruby/2.1.0/x86_64-darwin14.0", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/site_ruby", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/vendor_ruby/2.1.0", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/vendor_ruby/2.1.0/x86_64-darwin14.0", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/vendor_ruby", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/2.1.0", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/2.1.0/x86_64-darwin14.0"]
irb(main):003:0> spec.activate
=> true
irb(main):004:0> $LOAD_PATH
=> ["/usr/local/Cellar/ruby/2.1.2/lib/ruby/gems/2.1.0/gems/i18n-0.7.0.beta1/lib", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/gems/2.1.0/gems/thread_safe-0.3.4/lib", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/gems/2.1.0/gems/activesupport-4.2.0.beta1/lib", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/site_ruby/2.1.0", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/site_ruby/2.1.0/x86_64-darwin14.0", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/site_ruby", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/vendor_ruby/2.1.0", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/vendor_ruby/2.1.0/x86_64-darwin14.0", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/vendor_ruby", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/vendor_ruby", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/2.1.0", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/2.1.0/x86_64-darwin14.0"]

अब जब active_support लोड पथ पर है, तो आप जेम में फाइलों को किसी अन्य रूबी कोड की तरह ही require कर सकते हैं। आप require के मूल संस्करण का भी उपयोग कर सकते हैं, जिसे रूबीजेम्स द्वारा ओवरराइट किया गया था:

irb(main):005:0> gem_original_require 'active_support'
=> true

कूल!

थोड़ा ज्ञान बहुत आगे जाता है

रूबीजेम्स जटिल लग सकता है। लेकिन अपने सबसे बुनियादी स्तर पर, यह सिर्फ आपके लिए रूबी के लोड पथ का प्रबंधन कर रहा है। यह कहना नहीं है कि यह सब आसान है। मैंने कवर नहीं किया कि रूबीजेम्स जेम्स के बीच वर्जन विरोधों को कैसे प्रबंधित करता है, जेम बाइनरीज़ (जैसे rails और rake), C एक्सटेंशन, और बहुत सारा अन्य सामान।

लेकिन रूबीजेम्स को इस सतही स्तर पर भी जानने से बहुत मदद मिलेगी। थोड़े कोड पढ़ने और irb में खेलने के साथ, आप अपने जेम्स के सोर्स में गोता लगा पाएंगे। आप समझ सकते हैं कि आपके जेम्स कहां रहते हैं, ताकि आप यह सुनिश्चित कर सकें कि रूबीजेम्स उनके बारे में जानता है। और एक बार जब आप जान जाते हैं कि जेम्स कैसे लोड होते हैं, तो आप कुछ पागल दिखने वाली लोडिंग समस्याओं में खुदाई कर सकते हैं।

यदि आप इस बारे में अधिक जानना चाहते हैं कि रेल्स और बंडलर जेम्स को कैसे संभालते हैं, तो इस लेख को देखें: रेल्स जेम्स को कैसे संभालता है?

  1. YouTube चैनल मेंबरशिप कैसे काम करती है? पूरी जानकारी YouTube चैनल मेंबरशिप कैसे काम करती है? पूरी जानकारी

    YouTube मेंबरशिप प्रशंसकों के लिए अपने पसंदीदा YouTube चैनल्स को सपोर्ट करने का एक तरीका है, ऑटोमेटेड मासिक दान के लिए प्रतिबद्ध होकर। मेंबरशिप YouTubers को वित्तीय सहायता प्रदान करती है और उन्हें फुल-टाइम वीडियो बनाने में मदद करती है। इसके अलावा, मेंबर्स को मेंबर-ओनली पोस्ट एक्सेस और YouTube लाइव च

  1. डेटा स्क्रैपिंग कैसे काम करती है? डेटा स्क्रैपिंग कैसे काम करती है?

    चूंकि आप इसे पढ़ रहे हैं, इस बात की अच्छी संभावना है कि आपने डेटा स्क्रैपिंग के लाभों के बारे में सुना होगा और इसकी स्वचालित तकनीक आपको बिना कोई मैन्युअल काम किए बहुत सारा डेटा इकट्ठा करने देती है। लेकिन डेटा स्क्रैपिंग वास्तव में कैसे काम करती है? और क्या यह कठिन है, या कोई भी डेटा स्क्रैप करना सी

  1. C++ में एक्सेप्शन कैसे काम करते हैं C++ में एक्सेप्शन कैसे काम करते हैं

    परिचयC++ में एक्सेप्शन हैंडलिंग रनटाइम त्रुटियों को संभालने की एक प्रक्रिया है। एक्सेप्शन एक घटना है जो C++ में रनटाइम पर फेंकी जाती है। सभी एक्सेप्शन std::exception क्लास से प्राप्त होते हैं। यह एक रनटाइम त्रुटि है जिसे संभाला जा सकता है। यदि हम एक्सेप्शन को नहीं संभालते हैं तो यह एक्सेप्शन संदेश प