কয়েক সপ্তাহ আগে, আমি লিখেছিলাম কিভাবে রুবিজেমস রুবির লোড পাথ পরিচালনা করে। কিন্তু Rails সরাসরি RubyGems ব্যবহার করে না - এটি তার রত্নগুলি পরিচালনা করতে Bundler ব্যবহার করে৷
আপনি যদি না জানেন যে বান্ডলার কীভাবে কাজ করে, রত্নগুলি যেভাবে রেলে টানা হয় তা কিছুটা খুব বলে মনে হতে পারে জাদুকর কিভাবে একটি Gemfile
এ একটি লাইন যোগ করা হয় আপনার অ্যাপে কোড পেতে? নির্ভরতা পরিচালনা সহজ করতে বান্ডলার, রেল এবং রুবিজেমস কীভাবে একসাথে কাজ করে?
কেন বান্ডলার?
আমি বান্ডলারকে একজন কঠোর রত্ন ব্যবস্থাপক হিসাবে মনে করি। অর্থাৎ, বান্ডলার আপনাকে আপনার প্রয়োজনীয় রত্নগুলির সঠিক সংস্করণ ইনস্টল করতে সাহায্য করে এবং আপনার অ্যাপকে শুধু করতে বাধ্য করে। সেই সংস্করণগুলি ব্যবহার করুন৷৷
এই সত্যিই সহায়ক হতে সক্রিয় আউট. কেন বোঝার জন্য, আপনাকে বান্ডলারের আগে পৃথিবীতে ফিরে যেতে হবে।
বান্ডলারের আগে, কিছু সেটআপ স্ক্রিপ্টের সাথে আপনার রত্নগুলির সঠিক সংস্করণগুলি ইনস্টল করা এখনও বেশ সহজ ছিল:
gem install rails -v 4.1.0
gem install rake -v 10.3.2
...
(অর্থাৎ, যতক্ষণ পর্যন্ত Rails 4.1 এর নির্ভরতা Rake 10.3.2 এর নির্ভরতার সাথে বিরোধ না করে!)
কিন্তু আপনি যখন কয়েকটি ভিন্ন Rails অ্যাপে কাজ করছেন, তখন কী হবে, প্রতিটি রত্ন-এর বিভিন্ন সংস্করণের উপর নির্ভর করে? আপনি যদি সত্যিই সতর্ক না হন তবে আপনি ভয়ানক রত্ন সক্রিয়করণ ত্রুটির মধ্যে পড়বেন:
Gem::Exception: can't activate hpricot (= 0.6.161, runtime),
already activated hpricot-0.8.3
উঃ সেই বার্তা এখনও আমাকে দুঃস্বপ্ন দেয়। এর মানে সাধারণত আপনি রত্নগুলি ইনস্টল এবং আনইনস্টল করার জন্য একটি দিনের জন্য আছেন, তাই আপনি শুধু পেতে পারেন যে মেশিনে সঠিক সংস্করণ. এবং এর জন্য যা লাগে তা হল একটি দুর্ঘটনাজনিত gem install rake
আপনার সমস্ত সতর্ক পরিকল্পনা সম্পূর্ণরূপে তালগোল পাকানোর জন্য৷
rvm gemsets কিছু সময়ের জন্য এই সমস্যার সাথে সাহায্য করেছে। কিন্তু সেট আপ করার জন্য তাদের কিছু সময়ের প্রয়োজন ছিল এবং আপনি যদি ভুলবশত ভুল জেমসেটে ইন্সটল করেন, তাহলে আপনি একই সমস্যায় ফিরে আসবেন। বান্ডলারের সাথে, আপনাকে খুব কমই আপনার নির্ভরতা সম্পর্কে ভাবতে হবে। আপনার অ্যাপ্লিকেশানগুলি সাধারণত কাজ করে৷৷ এবং বান্ডলার জেমসেটের তুলনায় অনেক কম সেটআপ নেয়।
সুতরাং, বান্ডলার আপনার জন্য দুটি গুরুত্বপূর্ণ জিনিস করে। এটি আপনার প্রয়োজনীয় সমস্ত রত্ন ইনস্টল করে এবং এটি রুবিজেমসকে লক করে দেয়, তাই সেই রত্নগুলি কেবল সেই Rails অ্যাপের মধ্যে আপনার প্রয়োজন হতে পারে।
কিভাবে রেল বান্ডলার ব্যবহার করে?
এর মূল অংশে, বান্ডলার আপনার রত্নগুলিকে ইনস্টল করে এবং বিচ্ছিন্ন করে। কিন্তু এটি সব করে না। আপনার Gemfile
-এ রত্নগুলি থেকে কোডটি কীভাবে আসে আপনার রেল অ্যাপে এটি তৈরি করবেন?
আপনি যদি bin/rails
দেখেন :
#!/usr/bin/env ruby
begin
load File.expand_path("../spring", __FILE__)
rescue LoadError
end
APP_PATH = File.expand_path('../../config/application', __FILE__)
require_relative '../config/boot'
require 'rails/commands'
আপনি দেখতে পাবেন যে এটি ../config/boot
এর প্রয়োজনে রেল লোড করে . আসুন সেই ফাইলটি দেখি:
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' # Set up gems listed in the Gemfile.
আরে, এটা বান্ডলার! (এছাড়া, আমি এইমাত্র শিখেছি আপনি একটি ভিন্ন Gemfile
বেছে নিতে পারেন পরিবেশ পরিবর্তনশীল BUNDLE_GEMFILE
সেট করে ব্যবহার করতে . এটা বেশ চমৎকার।)
bundler/setup
কিছু জিনিস করে:
- এটি
$LOAD_PATH
থেকে রত্নগুলির সমস্ত পথ সরিয়ে দেয় (যা RubyGems যেকোন লোড পাথের কাজকে বিপরীত করে)। - তারপর, এটি আপনার
Gemfile.lock
-এর রত্নগুলির লোড পাথগুলিকে যোগ করে৷$LOAD_PATH
-এ ফিরে যান .
এখন, শুধুমাত্র রত্ন আপনি require
করতে পারেন থেকে ফাইলগুলি আপনার Gemfile
-এ রয়েছে .
তাই আপনার প্রয়োজনীয় সমস্ত রত্ন আপনার লোড পাথে রয়েছে। কিন্তু আপনি যখন নিজেই রুবিজেমস ব্যবহার করেন, তখনও আপনাকে require
করতে হবে আপনার প্রয়োজনীয় ফাইল। আপনি যখন বান্ডলারের সাথে রেল ব্যবহার করেন তখন কেন আপনার রত্নগুলির প্রয়োজন হয় না?
config/application.rb
এ দ্রুত নজর দিন , যা রেল বুট করার পরে চলে:
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)
এটা আবার বান্ডলার! Bundler.require
আপনি এটিতে পাস করা সমস্ত গ্রুপের সমস্ত রত্ন প্রয়োজন৷ ("গ্রুপ" দ্বারা, আমি বলতে চাচ্ছি যে গ্রুপগুলি আপনি আপনার জেমফাইলে উল্লেখ করেছেন।)
কোন গ্রুপগুলি Rails.groups
-এ রয়েছে যদিও?
# Returns all rails groups for loading based on:
#
# * The Rails environment;
# * The environment variable RAILS_GROUPS;
# * The optional envs given as argument and the hash with group dependencies;
#
# groups assets: [:development, :test]
#
# # Returns
# # => [:default, :development, :assets] for Rails.env == "development"
# # => [:default, :production] for Rails.env == "production"
def groups(*groups)
hash = groups.extract_options!
env = Rails.env
groups.unshift(:default, env)
groups.concat ENV["RAILS_GROUPS"].to_s.split(",")
groups.concat hash.map { |k, v| k if v.map(&:to_s).include?(env) }
groups.compact!
groups.uniq!
groups
end
ওয়েল, যে ব্যাখ্যা. Rails.groups
[:default, :development]
হতে যাচ্ছে আপনি যখন ডেভেলপমেন্ট মোডে রেল চালাচ্ছেন, [:default, :production]
উৎপাদন মোডে, এবং তাই।
সুতরাং, Bundler আপনার Gemfile
দেখবে সেই গোষ্ঠীগুলির প্রত্যেকের জন্য রত্নগুলির জন্য, এবং require
কল করুন এটি খুঁজে পাওয়া রত্ন প্রতিটি. আপনার যদি একটি রত্ন থাকে nokogiri
, এটি কল করবে require "nokogiri"
আপনার জন্য। আর সেই কারণেই আপনার রত্নগুলি সাধারণত রেলে কাজ করে, আপনার পক্ষ থেকে কোনও অতিরিক্ত কোড ছাড়াই৷
আপনার সরঞ্জামগুলি জানুন
৷আপনি যে সরঞ্জামগুলি ব্যবহার করেন তা যদি আপনি ভালভাবে বুঝতে পারেন তবে সেগুলির সাথে কাজ করা আরও সহজ হবে৷ তাই আপনি যদি নিজেকে সব সময় কিছু ব্যবহার করতে দেখেন, তবে এটিকে আরও একটু খনন করতে কয়েক মিনিট সময় নেওয়া মূল্যবান৷
আপনি যদি রুবি এবং রেলে কাজ করেন তবে আপনি প্রতিদিন রত্ন ব্যবহার করবেন। সেগুলি ভালভাবে শিখতে সময় নিন!