রুবিতে কোড লোডার - Zeitwerk বোঝা
Zeitwerk-এর সাহায্যে, আপনি আপনার প্রোগ্রামিংকে স্ট্রীমলাইন করতে পারেন এটা জেনে যে ক্লাস এবং মডিউল সব জায়গায় পাওয়া যায়।
কোড লোডার কি?
কোড লোডার ডেভেলপারদের classes
সংজ্ঞায়িত করতে দেয় এবং modules
বিভিন্ন ফাইল এবং ফোল্ডার জুড়ে এবং স্পষ্টভাবে প্রয়োজন ছাড়াই কোডবেস জুড়ে সেগুলি ব্যবহার করুন। রেল একটি সফ্টওয়্যার একটি অংশ যা কোড লোডার ব্যবহার করে একটি ভাল উদাহরণ. রেলে প্রোগ্রামিংয়ের জন্য স্পষ্ট require
প্রয়োজন হয় না কন্ট্রোলারে ব্যবহার করার আগে মডেল লোড করার জন্য কল করে। আসলে, Rails 6-এ, সবকিছুই app
-এ অ্যাপ বুটে ডিরেক্টরি স্বয়ংক্রিয়ভাবে লোড হয়, কিছু ব্যতিক্রম ছাড়া।
যদিও মনে করা সহজ যে কোড লোড করা হল require
কল করা , এটা যে সহজ না. কোড লোডিং আরও তিনটি ভাগে বিভক্ত করা যেতে পারে, নিম্নরূপ।
- অটো লোড হচ্ছে: এর মানে প্রয়োজন অনুযায়ী কোডটি অন-দ্য-ফ্লাই লোড করা হয়। উদাহরণস্বরূপ, Rails এ,
rails s
চলছে সমস্ত মডেল, কন্ট্রোলার ইত্যাদি লোড করে না। কিন্তু, মডেলের প্রথম আঘাতেUser
, এটি মডেল খুঁজে পেতে এবং ব্যবহার করতে স্বয়ংক্রিয় লোডিং প্রক্রিয়া চালায়। এটি স্বয়ংক্রিয়ভাবে লোড হচ্ছে আমাদের ডেভেলপমেন্ট এনভায়রনমেন্টের জন্য এর কিছু সুবিধা রয়েছে, কারণ আমাদের কাছে দ্রুত অ্যাপ এবংrails console
আছে শুরুর সময়।Rails.config.autoload_path
স্বয়ংক্রিয়ভাবে লোড হওয়ার পথগুলি নিয়ন্ত্রণ করে৷ - আগ্রহী লোড হচ্ছে: এর মানে হল অ্যাপ স্টার্টআপে কোড মেমরিতে লোড হয় এবং এটির প্রয়োজন হওয়ার আগে ধ্রুবক কল করার জন্য অপেক্ষা করে না। রেলে, কোড উৎপাদনে লোড করতে আগ্রহী। উপরের ব্যাখ্যা থেকে, প্রোডাকশনে অটোলোডিং কোডের ফলে প্রতিক্রিয়ার সময় ধীর হবে, কারণ প্রতিটি ধ্রুবক অন-দ্য-ফ্লাই প্রয়োজন হবে।
Rails.config.eager_load_paths
লোড করার জন্য পথগুলিকে নিয়ন্ত্রণ করে৷ - পুনঃলোড হচ্ছে: কোড লোডার ক্রমাগত
autoload_path
ফাইলে পরিবর্তনের জন্য নজর রাখছে এবং ফাইলগুলি পুনরায় লোড করে যখন এটি কোনও পরিবর্তন লক্ষ্য করে। রেলে, এটি উন্নয়নে বেশ কার্যকর হতে পারে, কারণ এটি আমাদেরrails s
চালাতে সক্ষম করে। এবং একই সাথে রেল সার্ভার পুনরায় চালু করার প্রয়োজন ছাড়াই পরিবর্তন করুন। এটি কর্মে পুনরায় লোড হচ্ছে৷
৷
আমরা সহজেই দেখতে পাচ্ছি যে এই ধারণাগুলির বেশিরভাগই তৈরি হয়েছে এবং রেলে বাস করা হয়েছে। Zeitwerk এই পরিবর্তন! Zeitwerk আমাদের যেকোন রুবি প্রকল্পে সমস্ত কোড লোডিং অ্যাকশন আনতে সক্ষম করে।
Zeitwerk কি?
Zeitwerk রুবির জন্য একটি দক্ষ এবং থ্রেড-নিরাপদ কোড লোডার এবং ওয়েব ফ্রেমওয়ার্ক (রেল, হানামি, সিনাত্রা), ক্লি টুলস এবং রত্ন সহ যেকোনো রুবি প্রকল্পে ব্যবহার করা যেতে পারে। এটির সাহায্যে, আপনি আপনার প্রোগ্রামিংকে স্ট্রীমলাইন করতে পারেন জেনে যে ক্লাস এবং মডিউল সর্বত্র উপলব্ধ। ঐতিহ্যগতভাবে, রেল এবং কিছু এই কার্যকারিতা সক্ষম করতে অন্যান্য রত্নগুলির অন্তর্নির্মিত কোড লোডার রয়েছে৷ যাইহোক, Zeitwerk এই ধারণাগুলিকে একটি রত্ন হিসাবে বের করে এবং রুবিস্টদের তাদের প্রকল্পগুলিতে এই ধারণাগুলি প্রয়োগ করার অনুমতি দেয়৷
Zeitwerk ইনস্টল করা হচ্ছে
প্রথম জিনিস প্রথমে, আমাদের রত্নটি ইনস্টল করতে হবে:
gem install zeitwerk
# OR in your Gemfile
gem 'zeitwerk', '~> 2.4.0'
Zeitwerk কনফিগার করা হচ্ছে
তো চলুন শুরু করা যাক বেসিক দিয়ে:
require 'zeitwerk'
loader = Zeitwerk::Loader.new
...
loader.setup
উপরের কোডটি একটি লোডার ইনস্ট্যান্স ইনস্ট্যান্সিয়েট করে এবং setup
কল করে . setup
কল করার পরে , লোডাররা কোড লোড করার জন্য প্রস্তুত। কিন্তু, তার আগে, loader
-এ সমস্ত প্রয়োজনীয় কনফিগারেশন ইতিমধ্যে আবৃত করা উচিত। এই নিবন্ধে, আমি loader
-এর কয়েকটি কনফিগারেশন কভার করব এবং আপনার কোড গঠনের জন্য নিয়মাবলী।
- ফাইল স্ট্রাকচার:Zeitwerk কাজ করার জন্য, ফাইল এবং ডিরেক্টরির নামগুলি তাদের সংজ্ঞায়িত মডিউল এবং শ্রেণির নামগুলির সাথে মেলে। উদাহরণস্বরূপ,
lib/my_gem.rb -> MyGem
lib/my_gem/foo.rb -> MyGem::Foo
lib/my_gem/bar_baz.rb -> MyGem::BarBaz
lib/my_gem/woo/zoo.rb -> MyGem::Woo::Zoo
- রুট নেমস্পেস:রুট নেমস্পেসগুলি এমন ডিরেক্টরি যেখানে
Zeitwerk
আপনার কোড খুঁজে পেতে পারেন। যখনmodules
এবংclasses
উল্লেখ করা হয়, Zeitwerk মেলে ফাইল নামের সাথে রুট নেমস্পেস অনুসন্ধান করতে জানে। উদাহরণস্বরূপ,
require 'zeitwerk'
loader = Zeitwerk::Loader.new
loader.push_dir("app/models")
loader.push_dir("app/controllers")
// matches as follows
app/models/user.rb -> User
app/controllers/admin/users_controller.rb -> Admin::UsersController
দুটি ভিন্ন ব্যবহারের ক্ষেত্রে রুট নেমস্পেস সংজ্ঞায়িত করার দুটি প্রাথমিক উপায় রয়েছে। ডিফল্ট উপায় নীচে দেখানো হয়েছে:
// init.rb
require 'zeitwerk'
loader = Zeitwerk::Loader.new
loader.push_dir("#{__dir__}/bar")
...
loader.setup
// bar/foo.rb
class Foo; end
এর মানে হল ক্লাস Foo
একটি স্পষ্ট Bar::Foo
ছাড়াই উল্লেখ করা যেতে পারে , বার ডিরেক্টরিটি একটি রুট নেমস্পেস হিসাবে কাজ করে। একটি নেমস্পেস সংজ্ঞায়িত করার দ্বিতীয় উপায় হল push_dir
এ কলে নামস্থানটি স্পষ্টভাবে উল্লেখ করা। :
// init.rb
require 'zeitwerk'
module Bar
end
loader = Zeitwerk::Loader.new
loader.push_dir("#{__dir__}/src", namespace: Bar)
loader.setup
// src/foo.rb
class Bar::Foo; end
এই কোড থেকে লক্ষ্য করার জন্য কয়েকটি জিনিস রয়েছে:
- মডিউল
Bar
push_dir
ব্যবহার করার আগে আগেই সংজ্ঞায়িত করা হয়েছিল . আমরা যে মডিউলটি ব্যবহার করতে চাই তা যদি কোনো তৃতীয় পক্ষের দ্বারা সংজ্ঞায়িত করা হয়, তাহলে আমরাpush_dir
এ কলে এটি ব্যবহার করার আগে একটি সাধারণ প্রয়োজন এটিকে সংজ্ঞায়িত করবে . -
push_dir
স্পষ্টভাবে নেমস্পেসBar
নির্দিষ্ট করে . - ফাইলটি
src/foo.rb
সংজ্ঞায়িতBar::Foo
,Foo
নয় , এবং ডিরেক্টরি তৈরি করার প্রয়োজন নেই, যেমনsrc/bar/foo.rb
.
-
স্বাধীন কোড লোডার:ডিজাইনের মাধ্যমে, Zeitwerk প্রতিটি প্রকল্প বা অ্যাপ নির্ভরতাকে তার পৃথক প্রকল্প ট্রি পরিচালনা করার অনুমতি দেয়। এর মানে প্রতিটি নির্ভরতার কোড লোডিং প্রক্রিয়া সেই নির্ভরতা দ্বারা পরিচালিত হয়। উদাহরণস্বরূপ, Rails 6-এ, Zeitwerk Rails অ্যাপের জন্য কোড লোডিং পরিচালনা করে এবং প্রতিটি রত্ন নির্ভরতাকে তার নিজস্ব প্রকল্প গাছ আলাদাভাবে পরিচালনা করার অনুমতি দেয়। একাধিক কোড লোডারের মধ্যে ওভারল্যাপিং ফাইল থাকা একটি ত্রুটি শর্ত৷
-
অটোলোডিং:উপরের সেটআপের সাথে, একবার
setup
এ কল করুন তৈরি করা হয়, চাহিদা অনুযায়ী সব ক্লাস এবং মডিউল পাওয়া যাবে। -
পুনরায় লোড করা:পুনরায় লোড সক্ষম করতে,
loader
এটির জন্য স্পষ্টভাবে কনফিগার করতে হবে। উদাহরণস্বরূপ,
loader = Zeitwerk::Loader.new
...
loader.enable_reloading # you need to opt-in before setup
loader.setup
...
loader.reload
loader.reload
কল ফ্লাইতে প্রজেক্ট ট্রিটিকে পুনরায় লোড করে এবং যেকোনো নতুন পরিবর্তন অবিলম্বে দৃশ্যমান হয়। যাইহোক, ফাইল সিস্টেমে পরিবর্তনগুলি সনাক্ত করতে এবং loader.reload
কল করার জন্য আমাদের এখনও একটি আশেপাশের ব্যবস্থার প্রয়োজন। . একটি সহজ সংস্করণ নীচে দেখানো হয়েছে:
require 'filewatcher'
loader = Zeitwerk::Loader.new
...
loader.enable_reloading
loader.setup
...
my_filewatcher = Filewatcher.new('lib/')
Thread.new(my_filewatcher) {|fw| fw.watch {|filename| loader.reload } }
রেলে Zeitwerk ব্যবহার করা
Zeitwerk Rails 6.0-এ ডিফল্টরূপে সক্রিয় থাকে। যাইহোক, আপনি এটি থেকে অপ্ট-আউট করতে পারেন এবং রেল classic
ব্যবহার করতে পারেন কোড লোডার।
# config/application.rb
config.load_defaults "6.0"
config.autoloader = :classic
রত্নগুলিতে Zeitwerk ব্যবহার করা
Zeitwerk রত্নগুলির জন্য একটি সুবিধাজনক পদ্ধতি প্রদান করে, যতক্ষণ না তারা আদর্শ রত্ন কাঠামো ব্যবহার করে (lib/special_gem
) এই সুবিধার পদ্ধতিটি নিম্নরূপ ব্যবহার করা যেতে পারে:
# lib/special_gem.rb
require 'zeitwerk'
module SpecialGem
end
loader = Zeitwerk::Loader.for_gem
loader.setup
মানক রত্ন কাঠামো সহ, for_gem
কল lib
যোগ করে একটি রুট নেমস্পেস হিসাবে ডিরেক্টরি, lib
-এর প্রতিটি কোড সক্রিয় করে ডিরেক্টরি স্বয়ংক্রিয়ভাবে পাওয়া যাবে।
আরও অনুপ্রেরণার জন্য, আপনি Zeitwerk ব্যবহার করে রত্নগুলি পরীক্ষা করতে পারেন:
- কারাফকা
- জেট
রেফারেন্স
রেল অটোলোডিং — এটি কীভাবে কাজ করে এবং কখন তা হয় না
Zeitwerk