বেশিরভাগ সময়, রুবিতে রত্ন শুধু কাজ করে। কিন্তু রুবি জাদুতে একটি বড় সমস্যা রয়েছে:যখন কিছু ভুল হয়ে যায়, তখন কেন তা খুঁজে বের করা কঠিন।
আপনি প্রায়শই আপনার রত্ন নিয়ে সমস্যায় পড়বেন না। কিন্তু আপনি যখন করেন, তখন গুগল আশ্চর্যজনকভাবে অসহায়। ত্রুটি বার্তাগুলি জেনেরিক, তাই তাদের বিভিন্ন কারণের মধ্যে একটি থাকতে পারে। এবং আপনি যদি রুবির সাথে রত্নগুলি আসলে কীভাবে কাজ করে তা বুঝতে না পারলে, আপনার নিজেরাই এই সমস্যাগুলি ডিবাগ করতে আপনার কঠিন সময় হবে৷
রত্নগুলি মনে হতে পারে৷ জাদুকর কিন্তু একটু তদন্ত করলে, সেগুলো বোঝা সহজ।
কি 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
আপনার রত্ন কোড কোথায় থাকে তা জানতে চাইলে সহায়ক হবে।
কীভাবে রত্ন কোডের প্রয়োজন হয়?
আপনার রত্নগুলির ভিতরে কোড ব্যবহার করতে আপনাকে সাহায্য করার জন্য, RubyGems রুবির 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
লোড করতে চান . 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 জটিল মনে হতে পারে. কিন্তু এটির সবচেয়ে মৌলিক স্তরে, এটি শুধুমাত্র আপনার জন্য রুবির লোড পাথ পরিচালনা করছে৷ এটা বলার অপেক্ষা রাখে না যে এটি সব সহজ। আমি কভার করিনি যে রুবিজেমস কীভাবে রত্ন, মণি বাইনারিগুলির (যেমন rails
) মধ্যে সংস্করণ দ্বন্দ্ব পরিচালনা করে এবং rake
), সি এক্সটেনশন, এবং অন্যান্য অনেক কিছু।
কিন্তু এই পৃষ্ঠ স্তরে RubyGems জানা অনেক সাহায্য করবে। irb
এ সামান্য কোড পড়া এবং খেলার সাথে , আপনি আপনার রত্ন উৎসের মধ্যে ডুব দিতে সক্ষম হবেন। আপনি বুঝতে পারেন আপনার রত্নগুলি কোথায় থাকে, তাই আপনি নিশ্চিত করতে পারেন যে রুবিজেমস সেগুলি সম্পর্কে জানে৷ এবং একবার আপনি জানবেন কিভাবে রত্নগুলি লোড করা হয়, আপনি কিছু উন্মাদ-সুদর্শন লোডিং সমস্যার মধ্যে খনন করতে পারেন৷
আপনি যদি রেল এবং বান্ডলার কীভাবে রত্নগুলি পরিচালনা করে সে সম্পর্কে আরও জানতে চান তবে এই নিবন্ধটি দেখুন:রেলগুলি কীভাবে রত্নগুলি পরিচালনা করে?.