কম্পিউটার টিউটোরিয়াল

রুবি জেম বুঝুন: সেগুলো কীভাবে কাজ করে এবং কীভাবে সমস্যা সমাধান করবেন

অধিকাংশ সময়, রুবিতে জেমগুলো Just Work করে। কিন্তু রুবি ম্যাজিকের সাথে একটা বড় সমস্যা: জিনিসগুলো ভুল হলে, কেন সেটা হয়েছে সেটা বের করা কঠিন।

আপনি আপনার জেমের সাথে সমস্যায় খুব কম পড়বেন। কিন্তু когда আপনি পড়েন, গুগল আশচর্যভাবে অনহেল্পফুল। এরর মেসেজগুলো জেনেরিক, তাই সেগুলোর পেছনে অনেক ভিন্ন কারণ থাকতে পারে। এবং আপনি যদি না বুঝেন জেমগুলো আসলে রুবির সাথে কীভাবে কাজ করে, তবে আপনি নিজে এই সমস্যাগুলো ডিবাগ করতে খুব কষ্ট পাবেন।

জেমগুলো ম্যাজিকাল লাগতে পারে। কিন্তু একটু তদন্ত করলে, সেগুলো বুঝা খুব সহজ।

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 environment রান করলে gem install আপনার জেমগুলো কোথায় ইনস্টল করবে সেটা দেখতে পাবেন ( 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 `<main>'

রুবিজেমস সেই এরর মেসেজটি দেখে, এবং বুঝতে পারে এটা একটি জেমের ভিতরে 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>

তারপর, এটা জেমটি এক্টিভেট করে, যেটা জেমের ভিতরের কোডকে রুবির লোড পാതhez যোগ করে (যেসব ডিরেক্টরি থেকে আপনি ফাইল 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-এর অরিজিনাল ভার্সনও ব্যবহার করতে পারেন, যেটা রুবিজেমস দ্বারা ওভাররাইট করা হয়েছিল:

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

কুল!

একটু জ্ঞান langt الطريق

রুবিজেমস জটিল লাগতে পারে। তবে এটার সবচেয়ে বেসিক লেভেলে, এটা শুধু আপনার জন্য রুবির লোড পাথ ম্যানেজ করছে। এটার মানে নয় সবকিছু সহজ। আমি কভার করিনি রুবিজেমস কীভাবে জেমগুলোর মধ্যে ভার্সন কনফ্লিক্ট ম্যানেজ করে, জেম বাইনারি (যেন rails এবং rake), সি এক্সটেনশন, এবং আরও অনেক কিছু।

তবে রুবিজেমস এমনকি এই সারফেস লেভেলেও জানলে খুব সাহায্য হবে। একটু কোড রিডিং এবং irb-এ খেলা দিয়ে, আপনি আপনার জেমের সোর্সে ডুবতে পারবেন। আপনি বুঝতে পারবেন আপনার জেমগুলো কোথায় থাকে, যাতে নিশ্চিত হয় রুবিজেমস সেগুলোর সম্পর্কে জানে। এবং একবার আপনি জানলে জেমগুলো কীভাবে লোড হয়, আপনি কিছু পাগলামীর লোডিং সমস্যা ডিবাগ করতে পারবেন।

আপনি যদি রেইলস এবং বান্ডলার কীভাবে জেম হ্যান্ডল করে সেটা সম্পর্কে আরও জানতে চান, এই আর্টিকেলটি চেক করুন: How does Rails handle gems?.

  1. Wi-Fi এক্সটেন্ডার কীভাবে কাজ করে?

  2. YouTube চ্যানেল মেম্বারশিপ কীভাবে কাজ করে?

  3. ডেটা স্ক্র্যাপিং কীভাবে কাজ করে?

  4. C++-এ এক্সসেপশন কীভাবে কাজ করে