ज्यादातर समय, रूबी जस्ट वर्क में रत्न। लेकिन रूबी जादू के साथ एक बड़ी समस्या है:जब चीजें गलत हो जाती हैं, तो इसका पता लगाना मुश्किल होता है।
आप अक्सर अपने रत्नों के साथ समस्याओं में नहीं चलेंगे। लेकिन जब आप ऐसा करते हैं, तो 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 में करता है)। टिप्पणी बहुत स्पष्ट है:
##
# 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 उनके बारे में जानता है। और एक बार जब आप जान जाते हैं कि रत्न कैसे लोड किए जाते हैं, तो आप कुछ पागल दिखने वाली लोडिंग समस्याओं में खुदाई कर सकते हैं।
यदि आप इस बारे में अधिक जानना चाहते हैं कि रेल और बंडलर रत्नों को कैसे संभालते हैं, तो इस लेख को देखें:रेल रत्नों को कैसे संभालती है?.