প্যাকেজ এবং ক্রেট (Packages and Crates)
মডিউল সিস্টেমের প্রথম যে অংশগুলো আমরা কভার করব সেগুলো হল প্যাকেজ এবং ক্রেট।
একটি ক্রেট (crate) হল কোডের সবচেয়ে ছোট অংশ যা Rust কম্পাইলার একবারে বিবেচনা করে। এমনকি যদি আপনি cargo
-র পরিবর্তে rustc
চালান এবং একটি একক সোর্স কোড ফাইল পাস করেন (যেমনটি আমরা চ্যাপ্টার ১-এর "রাইটিং অ্যান্ড রানিং এ রাস্ট প্রোগ্রাম"-এ করেছিলাম), কম্পাইলার সেই ফাইলটিকে একটি ক্রেট হিসাবে বিবেচনা করে। ক্রেটগুলোতে মডিউল থাকতে পারে এবং মডিউলগুলো অন্যান্য ফাইলে সংজ্ঞায়িত করা যেতে পারে যা ক্রেটের সাথে কম্পাইল করা হয়, যেমনটি আমরা আসন্ন বিভাগগুলোতে দেখব।
একটি ক্রেট দুটি ফর্মের মধ্যে একটি হতে পারে: একটি বাইনারি ক্রেট বা একটি লাইব্রেরি ক্রেট। বাইনারি ক্রেটগুলো হল এমন প্রোগ্রাম যা আপনি একটি এক্সিকিউটেবলে কম্পাইল করতে পারেন, যা আপনি চালাতে পারেন, যেমন একটি কমান্ড লাইন প্রোগ্রাম বা একটি সার্ভার। প্রতিটি বাইনারি ক্রেটে অবশ্যই main
নামক একটি ফাংশন থাকতে হবে যা এক্সিকিউটেবল চালানোর সময় কী ঘটবে তা নির্ধারণ করে। আমরা এ পর্যন্ত যতগুলো ক্রেট তৈরি করেছি তার সবই বাইনারি ক্রেট।
লাইব্রেরি ক্রেটগুলোতে একটি main
ফাংশন থাকে না এবং সেগুলো একটি এক্সিকিউটেবলে কম্পাইল হয় না। পরিবর্তে, তারা কার্যকারিতা সংজ্ঞায়িত করে যা একাধিক প্রোজেক্টের সাথে শেয়ার করার উদ্দেশ্যে তৈরি। উদাহরণস্বরূপ, চ্যাপ্টার ২-তে আমরা যে rand
ক্রেটটি ব্যবহার করেছি সেটি র্যান্ডম সংখ্যা তৈরি করার কার্যকারিতা সরবরাহ করে। বেশিরভাগ সময় যখন Rustacean-রা "ক্রেট" বলে, তখন তারা লাইব্রেরি ক্রেট বোঝায় এবং তারা "লাইব্রেরি"-এর সাধারণ প্রোগ্রামিং ধারণার সাথে "ক্রেট" শব্দটিকে বিনিময়যোগ্যভাবে ব্যবহার করে।
ক্রেট রুট (crate root) হল একটি সোর্স ফাইল যেখান থেকে Rust কম্পাইলার শুরু করে এবং আপনার ক্রেটের রুট মডিউল তৈরি করে (আমরা “স্কোপ এবং গোপনীয়তা নিয়ন্ত্রণ করতে মডিউল সংজ্ঞায়িত করা”-তে মডিউলগুলো বিস্তারিতভাবে ব্যাখ্যা করব)।
একটি প্যাকেজ (package) হল এক বা একাধিক ক্রেটের একটি বান্ডিল যা কার্যকারিতার একটি সেট সরবরাহ করে। একটি প্যাকেজে একটি Cargo.toml ফাইল থাকে যা বর্ণনা করে কিভাবে সেই ক্রেটগুলো তৈরি করতে হয়। Cargo আসলে একটি প্যাকেজ যাতে কমান্ড লাইন টুলের জন্য বাইনারি ক্রেট রয়েছে যা আপনি আপনার কোড তৈরি করতে ব্যবহার করেছেন। Cargo প্যাকেজে একটি লাইব্রেরি ক্রেটও রয়েছে যার উপর বাইনারি ক্রেট নির্ভর করে। অন্য প্রোজেক্টগুলো Cargo লাইব্রেরি ক্রেটের উপর নির্ভর করতে পারে যাতে Cargo কমান্ড লাইন টুল যে লজিক ব্যবহার করে সেটি ব্যবহার করা যায়। একটি প্যাকেজে আপনি যত খুশি বাইনারি ক্রেট থাকতে পারে, কিন্তু সর্বাধিক শুধুমাত্র একটি লাইব্রেরি ক্রেট থাকতে পারে। একটি প্যাকেজে অবশ্যই অন্তত একটি ক্রেট থাকতে হবে, সেটি লাইব্রেরি হোক বা বাইনারি ক্রেট।
আসুন আমরা যখন একটি প্যাকেজ তৈরি করি তখন কী ঘটে তা দেখি। প্রথমে আমরা cargo new my-project
কমান্ডটি প্রবেশ করাই:
$ cargo new my-project
Created binary (application) `my-project` package
$ ls my-project
Cargo.toml
src
$ ls my-project/src
main.rs
আমরা cargo new my-project
চালানোর পরে, Cargo কী তৈরি করে তা দেখতে আমরা ls
ব্যবহার করি। প্রোজেক্ট ডিরেক্টরিতে, একটি Cargo.toml ফাইল রয়েছে, যা আমাদের একটি প্যাকেজ দেয়। এছাড়াও একটি src ডিরেক্টরি রয়েছে যাতে main.rs রয়েছে। আপনার টেক্সট এডিটরে Cargo.toml খুলুন এবং লক্ষ্য করুন যে src/main.rs-এর কোনো উল্লেখ নেই। Cargo একটি নিয়ম অনুসরণ করে যে src/main.rs হল প্যাকেজের নামের সাথে একই নামের একটি বাইনারি ক্রেটের ক্রেট রুট। একইভাবে, Cargo জানে যে যদি প্যাকেজ ডিরেক্টরিতে src/lib.rs থাকে, তাহলে প্যাকেজটিতে প্যাকেজের নামের সাথে একই নামের একটি লাইব্রেরি ক্রেট রয়েছে এবং src/lib.rs হল এর ক্রেট রুট। Cargo লাইব্রেরি বা বাইনারি তৈরি করতে ক্রেট রুট ফাইলগুলো rustc
-তে পাস করে।
এখানে, আমাদের কাছে এমন একটি প্যাকেজ রয়েছে যাতে শুধুমাত্র src/main.rs রয়েছে, অর্থাৎ এটিতে শুধুমাত্র my-project
নামের একটি বাইনারি ক্রেট রয়েছে। যদি একটি প্যাকেজে src/main.rs এবং src/lib.rs থাকে, তবে এতে দুটি ক্রেট রয়েছে: একটি বাইনারি এবং একটি লাইব্রেরি, উভয়ের নামই প্যাকেজের নামের মতো। একটি প্যাকেজে src/bin ডিরেক্টরিতে ফাইল রেখে একাধিক বাইনারি ক্রেট থাকতে পারে: প্রতিটি ফাইল একটি পৃথক বাইনারি ক্রেট হবে।