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

रत्न कैसे काम करते हैं?

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

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

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

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 . के अंतर्गत होंगे निर्देशिका।

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

जेम कोड की आवश्यकता कैसे पड़ती है?

अपने रत्नों के अंदर कोड का उपयोग करने में आपकी मदद करने के लिए, RubyGems, Ruby के 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 load लोड करना चाहते हैं . RubyGems, Ruby के require . का उपयोग करके इसकी आवश्यकता करने का प्रयास करेगा तरीका। इससे आपको यह त्रुटि मिलती है:

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

RubyGems उस त्रुटि संदेश को देखता है, और देखता है कि उसे 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/2.1.0", "/usr/local/Cellar/ruby/2.1.2/lib/ruby/2.1.0/x86_64-darwin14.0"]

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

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

बढ़िया!

थोड़ा सा ज्ञान बहुत बड़ा काम करता है

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

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

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


  1. YouTube चैनल की सदस्यता कैसे काम करती है?

    YouTube सदस्यता प्रशंसकों के लिए स्वचालित मासिक दान करने के लिए अपने पसंदीदा YouTube चैनलों का समर्थन करने का एक तरीका है। सदस्यता YouTubers को वित्तीय सहायता प्रदान करती है और उन्हें पूर्णकालिक वीडियो बनाने में मदद करती है। इसके अलावा, सदस्यों को YouTube लाइव चैट के लिए सिर्फ़ सदस्यों के लिए पोस्ट

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

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

  1. C++ में अपवाद कैसे काम करते हैं?

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