রুবি জেম কী?
একটি জেম হলো একটি প্যাকেজ যা আপনি ডাউনলোড ও ইনস্টল করতে পারেন। আপনি যখন একটি ইনস্টলড জেম রিকোয়ার করেন তবে আপনি আপনার রুবি প্রোগ্রামে অতিরিক্ত ফাংশনালিটি যোগ করছেন।
জেম আপনাকে দেয়:
- আপনার রেলস অ্যাপে লগইন ফিচার যোগ করতে
- এক্সটার্নাল সার্ভিস সহজে ব্যবহার করতে (যেমন API)
- ওয়েব অ্যাপ্লিকেশন বানাতে
এটি শুধু কিছু উদাহরণ। প্রতিটি জেমের নিজস্ব লক্ষ্য আছে।
আমরা কেন জেম ব্যবহার করি?
- এটি রুবিতে লাইব্রেরি ও টুল শেয়ার করার পদ্ধতি
- একটি জেমের ফাইল স্ট্রাকচার ও ফরম্যাট এটিকে বুঝতে সহজ করে
- প্রতিটি জেমের সাথে আসা একটি স্পেসিফিকেশন (“.spec”) ফাইল ডিপেন্ডেন্সি (অন্যান্য রিকোয়ার্ড জেম) বর্ণনা করে যাতে কোডটিকে সবকিছু থাকে যা সেটি কাজ করতে
RubyGems-এর ধন্যবাদে, আমাদের কাছে সহায়ক লাইব্রেরির একটি সমৃদ্ধ ইকোসিস্টেম আছে শুধু একটা gem install দূরে!
একটি দেওয়া (নন-जেম) প্রজেক্টের জন্য রিকোয়ার্ড জেমের লিস্ট একটি স্পেশাল ফাইলে “Gemfile” নামে লিস্ট করা যেতে পারে যাতে সেগুলো Bundler দিয়ে অটোমেটিক্যালি ইনস্টল করা যায়। উভয়টি পরে এই গাইডে কভার করা হয়েছে।
জেমের কিছু উদাহরণ কী?
- Rails, এবং এর সকল কম্পোনেন্ট (ActiveRecord, ActiveSupport, ইত্যাদি) রুবি জেম হিসেবে বিতরণ করা হয়
- Pry, irb-এর একটি পাওয়ারফুল অল্টারনেটিভ
- Nokogiri, একটি জনপ্রিয় XML ও HTML পার্সার
বেশিরভাগ জেম পিউর রুবি কোড।
কয়েকটি জেম রুবি সি এক্সটেনশন ইনক্লুড করে উন্নত পারফরম্যান্সের জন্য।
এই এক্সটেনশনটি আপনি জেম ইনস্টল করলে অটোমেটিক্যালি বিল্ড হয়। কিছু কেসে, আপনাকে ম্যানুয়ালি অতিরিক্ত সফটওয়্যার ইনস্টল করতে হতে পারে যা RubyGems দ্বারা ম্যানেজ করা হয় না।
এখন:
আপনার নিজস্ব জেম বানাতে এবং যা জেম বানায় সেই ফাইলগুলো দেখে জেম সম্পর্কে আরও শিখি।
রুবি জেম কীভাবে বানাবেন
আপনি bundle gem <name> চালিয়ে একটি নতুন জেমের জন্য ফাইলগুলো প্রিপেয়ার করতে পারেন।
উদাহরণস্বরূপ:
bundle gem awesome_gem
একটি Gem নিচের স্ট্রাকচার দিয়ে গঠিত:
├── awesome_gem.gemspec ├── bin │ ├── console │ └── setup ├── Gemfile ├── lib │ ├── awesome_gem │ │ └── version.rb │ └── awesome_gem.rb ├── Rakefile ├── README.md └── test ├── awesome_gem_test.rb └── test_helper.rb
এই .gemspec ফাইলটি হলো যেখানে আপনি জেম সম্পর্কে সকল ইনফরমেশন পাবেন।
এতে থাকে:
- জেমের নাম
- জেম সারসংক্ষেপ (সংক্ষিপ্ত বর্ণনা)
- লেখকের নাম
- ডিপেন্ডেন্সি লিস্ট
- জেমে ইনক্লুড করার ফাইল লিস্ট
- ঐচ্ছিক: লেখকের ইমেইল, প্রজেক্ট URL (হোমপেজ), এক্সিকিউটেবল, সি এক্সটেনশন, লং বর্ণনা।
জেম ভার্সন নিজে একটি কনস্ট্যান্ট হিসেবে ডিফাইন করা থাকে lib/<gem_name>/version.rb-এ।
এখানে একটি উদাহরণ gemspec:
Gem::Specification.new do |spec| spec.name = "awesome_gem" spec.version = AwesomeGem::VERSION spec.authors = ["Jesus Castello"] spec.summary = "Example gem for article about Ruby gems" spec.files = Dir['**/**'].grep_v(/.gem$/) spec.require_paths = ["lib"] spec.add_development_dependency "bundler", "~> 1.16" spec.add_development_dependency "rake", "~> 10.0" spec.add_development_dependency "minitest", "~> 5.0" end
require_paths অ্যারেটি হলো যেখানে রুবি আপনার জেম ফাইল খুঁজবে যখন আপনি সেগুলো রিকোয়ার করবেন। এটি আপনাকে আপনার কোড lib/<gem_name>/-এ রাখতে দেয় এবং তারপর require "<gem_name>/<file_name>" দিয়ে রিকোয়ার করতে দেয়।
উদাহরণস্বরূপ:
lib/awesome_gem/parser.rb নামে একটি ফাইল require "awesome_gem/parser" হিসেবে রিকোয়ার করা যাবে জেমের যেকোনো জায়গা থেকে।
আপনার অধিকাংশ রিকোয়ার থাকবে lib/<gem_name>.rb-এ (/lib-এর রুটে একমাত্র ফাইল)।
এই ফাইলটি লোড হয় যখন আপনি জেম require করেন!
পরবর্তী:
add_development_dependency লাইনগুলো ডেভেলপমেন্টে আপনি যে জেমগুলো ব্যবহার করবেন সেগুলো ডিফাইন করে।
এই গুলো হলো minitest, RSpec, বা pry এর মত জেম।
যখন add_dependency আপনার কোডের অংশ হিসেবে আপনি যে জেমগুলো ব্যবহার করেন সেগুলো ডিফাইন করে।
আপনি একবার সারসংক্ষেপ ও বর্ণনা ডিফল্ট ভ্যালু থেকে পরিবর্তন করলে… আপনি bin/console প্রোগ্রাম ব্যবহার করে আপনার জেমসহ একটি irb সেশন লোড করতে পারবেন যা bundle gem তৈরি করে।
উদাহরণ:
$ bin/console irb(main):001:0> irb(main):002:0> irb(main):003:0> AwesomeGem => AwesomeGem irb(main):004:0> irb(main):005:0> AwesomeGem::VERSION => "0.1.0"
তারপর আপনি gem build <name>.gemspec দিয়ে জেম প্যাকেজ করতে পারেন এবং gem push দিয়ে rubygems.org-এ পাবলিশ করতে পারেন।
Bundler কী?
রুবি জেম সম্পর্কে শিখতে শিখতে আপনি Bundler-এর কথাও পড়তে পারেন।
কিন্তু Bundler আসলে কী?
Bundler হলো ডিপেন্ডেন্সি ম্যানেজমেন্ট এর জন্য একটি টুল।
RubyGems কি ইতিমধ্যে এটি হ্যান্ডেল করে?
হ্যাঁ, করে… কিন্তু শুধু জেমগুলোর জন্য।
আপনার রেগুলার রুবি অ্যাপ্লিকেশন জেম হিসেবে বিল্ট নয়, তাই এটিকে এই ফিচার নেই।
সেজন্য Bundler আছে!
Gemfile বোঝা
আপনি কি সেই Gemfile ফাইলগুলো দেখেছেন?
সেটি হলো যেখানে আপনি লিখেন আপনার রুবি অ্যাপ্লিকেশনের জন্য কোন জেমগুলো ব্যবহার করতে চান।
এই জেমগুলো আপনার জন্য লোড হবে require ছাড়া।
একটি Gemfile এমন দেখায়:
ruby '2.5.0' gem 'rails', '~> 5.2.1' gem 'sqlite3' gem 'puma', '~> 3.11' gem 'bootsnap', '>= 1.1.0', require: false
Bundler (এবং রুবিজেমস ২.০ থেকে) এই ফাইল পড়ে এবং রিকোয়েস্ট করা ভার্সনগুলো ইনস্টল করে।
bundle install কমান্ড চালালে আপনি এটা দেখবেন:
Using turbolinks-source 5.1.0 Using turbolinks 5.1.1 Using uglifier 4.1.18 Using web-console 3.6.2 Bundle complete! 18 Gemfile dependencies, 78 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed.
এখন:
Gemfile-এ প্রতিটি জেমের ভার্সন ডিক্লেয়ার করার সময় এই সিম্বলগুলো (যেমন ~>) কী?
এইগুলোর মাধ্যমে আপনি একটি ভার্সন রেঞ্জ রিকোয়েস্ট করতে পারেন।
আপনি বলতে পারেন, “আমি চাই ভার্সনটি ১.২-এর সমান বা বড় হবে, কিন্তু ২.০-এর চেয়ে ছোট”।
যেটি এমন দেখাবে:
gem 'puma', '~> 1.2'
~> এই রেঞ্জের জন্য একটি শর্টকাট:
gem 'puma', '>= 1.2', '< 2.0'
~> 5.2.1-এর কেসে, এর মানে ঠিক এই:
'>= 5.2.1', '< 5.3'
ভার্সন নাম্বার যত স্পেসিফিক হবে, ভার্সন রেঞ্জ তত রেস্ট্রিক্টেড হবে।
Gemfile অপশনস এবং Gemfile.lock
Gemfile-এ জেম রিকোয়ার করার সময় আপনার কয়েকটি অপশন আছে।
উদাহরণস্বরূপ:
আপনি একটি জেম ভিন্ন সোর্স থেকে পুল করতে চাইতে পারেন, যেন GitHub।
এটি সাহায্যকর যখন আপনি প্রজেক্টের লেটেস্ট ভার্সন ব্যবহার করতে চান, এমনকি যদি এটি rubygems.org-এ রিলিজ না হয়।
এখানে একটি উদাহরণ:
gem "rails", git: "git@github.com:rails/rails.git"
আপনি একটি branch অপশন পাস করতে পারেন ব্রাঞ্চ থেকে কোড ব্যবহার করতে যা মাস্টার নয়।
এভাবেই:
gem "awesome_print", git: "git@github.com:awesome-print/awesome_print.git", branch: "v2"
আপনি যে আরেকটি অপশন পেতে পারেন সেটি require: false।
এটি কী করে?
এটি Bundler-কে বলে জেমটি অটো-রিকোয়ার না করুন। এর মানে আপনাকে আপনার কোডে যখন দরকার হবে require করতে হবে।
এটি সীমিত স্কোপের জেমের জন্য ব্যবহার হয়।
উদাহরণস্বরূপ:
জেমগুলো যা আপনি একটি নির্দিষ্ট রেক টাস্কে ব্যবহার করেন, কিন্তু আপনার রেলস কন্ট্রোলার ও মডেলে ব্যবহার করেন না। সুবিধা হলো আপনি আপনার অ্যাপ কোডে মেমরি বাঁচায় কারণ আপনি শুধু তখন লোড করেন যখন দরকার।
আপনি এনভায়রনমেন্ট অনুযায়ী জেম গ্রুপও করতে পারেন।
এর মানে আপনার ডেভেলপমেন্ট-এ শুধু ইনস্টল ও লোড হওয়া জেম থাকতে পারে (যেন capybara এবং pry)।
শেষে, bundler একটি Gemfile.lock তৈরি করে।
পার্থক্য কী?
একটি Gemfile.lock অটো-জেনারেটেড এবং এटी বলে প্রতিটি জেমের এক্সাক্ট কোন ভার্সন ইনস্টল হয়েছে।
Bundler এই ভার্সনগুলো ইনস্টল করবে যাতে আপনি এই অ্যাপ্লিকেশন প্রোডাকশনে ডিপ্লয় করলে, বা আপনার প্রজেক্ট অন্য ডেভেলপারদের সাথে শেয়ার করলে, সবাই জেমের একই সেট দিয়ে কাজ করবে।
উপকারী জেম এবং Bundler কমান্ড
| Command | Description |
|---|---|
| gem list | আপনার সব ইনস্টলড জেম লিস্ট করে। ফিল্টারের জন্য আর্গুমেন্ট নেয় (উদাহরণ: gem list active) |
| gem which <name> | একটি জেম কোথায় ইনস্টলড সেটি পাথ দেয়। |
| gem search <name> | কনফিগারড সোর্স থেকে জেম সার্চ করে (ডিফল্ট: rubygems.org)। রেগুলার এক্সপ্রেশন নেয় (উদাহরণ: gem search "\Aawesome_") |
| gem env | আপনার জেম এনভায়রনমেন্ট সম্পর্কে ইনফো দেখায় (ভার্সন, পাথ, কনফিগারেশন)। |
| gem install <name> -v <version> | নির্দিষ্ট জেম ভার্সন ইনস্টল করতে দেয় (উদাহরণ: gem install sinatra -v 2.0.0) |
| bundle viz | কারেন্ট প্রজেক্টের ডিপেন্ডেন্সি গ্রাফ ভিজুয়ালাইজেশন জেনারেট করে। |
| bundle show | Bundler দিয়ে ইনস্টলড একটি নির্দিষ্ট জেমের ইনফো দেখায়। Gemfile থাকা ফোল্ডারের ভিতরে হতে হবে। |
| bundle outdated | কারেন্ট প্রজেক্টে আউটডেটেড জেমের লিস্ট দেখায়। --groups অপশন দিয়ে গ্রুপ করতে পারেন। |
| bundle console | কারেন্ট প্রজেক্টের Gemfile-এর জেমসহ একটি irb সেশন রান করে। |
সারসংক্ষেপ
আপনি RubyGems, রুবির প্যাকেজ সিস্টেম সম্পর্কে শিখেছেন। আপনি একটি জেম কীভাবে স্ট্রাকচারড, Gemfile কী, Bundler এবং Gemfile ও Gemfile.lock-এর পার্থক্য শিখেছেন।
আশা করি আপনি এটি উপকারী পেয়েছেন!
দয়া করে এই আর্টিকেলটি শেয়ার করুন, নিউজলেটার সাবস্ক্রাইব করুন যদি এখনও না করেছেন (৯০০০+ রুবি ডেভেলপার!) এবং আমার রুবি বই চেক আউট করুন।
পড়ার জন্য ধন্যবাদ এবং একটি চমৎকার দিন 🙂