Modules (মডিউলস)
রাস্টে Modules হল এমন একটি সিস্টেম যা কোডকে সংগঠিত এবং ভাগ করা সহজ করে। মডিউলগুলি ব্যবহার করে আমরা কোডের পুনঃব্যবহারযোগ্যতা এবং পাঠযোগ্যতা বৃদ্ধি করতে পারি। মডিউল আমাদের কোডের বিভিন্ন অংশকে একে অপর থেকে বিচ্ছিন্ন এবং নির্দিষ্ট উপায়ে সংগঠিত করতে সাহায্য করে।
মডিউল ব্যবহারের সুবিধা:
- কোড সংগঠন: কোডের বিভিন্ন ফাংশন, স্ট্রাকচার, বা অন্যান্য আইটেম একত্রিত করতে মডিউল ব্যবহৃত হয়।
- নাম স্পেস (Namespace): মডিউল নাম স্পেস প্রদান করে, যাতে একই নামের ভেরিয়েবল বা ফাংশন বিভিন্ন মডিউলে আলাদা থাকে।
মডিউল ডিফাইন করা:
রাস্টে মডিউল ডিফাইন করার জন্য mod কিওয়ার্ড ব্যবহার করা হয়। একটি মডিউল সাধারণত একটি .rs ফাইলের মাধ্যমে সংজ্ঞায়িত হয়।
উদাহরণ:
mod greeting {
pub fn say_hello() {
println!("Hello, world!");
}
fn private_function() {
println!("This is a private function.");
}
}
fn main() {
greeting::say_hello(); // Accessible because it's public
// greeting::private_function(); // Error: private function, cannot be accessed
}এখানে, greeting একটি মডিউল যার মধ্যে একটি পাবলিক ফাংশন say_hello এবং একটি প্রাইভেট ফাংশন private_function রয়েছে। pub কিওয়ার্ড ব্যবহার করে ফাংশনটি পাবলিক করা হয়েছে, যাতে এটি বাইরের কোডে অ্যাক্সেস করা যায়।
মডিউলের ফাইল সিস্টেম:
মডিউলগুলির জন্য রাস্ট ফাইল সিস্টেমে একটি কাঠামো অনুসরণ করে:
mod.rsফাইল: যখন মডিউল একটি সাব-ডিরেক্টরির মধ্যে থাকে, তখন ওই ডিরেক্টরিতেmod.rsফাইল থাকবে।- সাধারণত, একক
.rsফাইলও একটি মডিউল হিসাবে কাজ করতে পারে।
Crates (ক্রেটস)
Crates হল রাস্টের প্যাকেজ এবং ইউনিট। একটি ক্রেট হল একটি স্বাধীন কোডবেস যার মধ্যে মডিউল এবং অন্যান্য ক্রেট থাকতে পারে। রাস্টের প্যাকেজ ম্যানেজার Cargo এর মাধ্যমে ক্রেট পরিচালনা করা হয়। একটি ক্রেট একটি লাইব্রেরি বা একটি এক্সিকিউটেবল হতে পারে।
ক্রেটের ধরন:
- লাইব্রেরি ক্রেট (Library Crate): এটি এমন একটি ক্রেট যা শুধুমাত্র কোডের একটি সেট প্রদান করে এবং সরাসরি চালানো যায় না। অন্য প্রোগ্রামে এই ক্রেটের ফাংশন ব্যবহার করা যেতে পারে।
- এক্সিকিউটেবল ক্রেট (Executable Crate): এটি একটি সম্পূর্ণ প্রোগ্রাম যা চালানো যায়। এই ধরনের ক্রেটের মধ্যে একটি
mainফাংশন থাকে, যা প্রোগ্রাম চালানোর সময় কার্যকর হয়।
ক্রেট ব্যবহারের উদাহরণ:
রাস্টে একটি ক্রেট তৈরি করার জন্য প্রথমে Cargo ব্যবহার করা হয়:
নতুন ক্রেট তৈরি করা:
cargo new my_projectক্রেটের লাইব্রেরি অংশ যোগ করা:
আপনার ক্রেটের কোড লাইব্রেরি আকারে থাকতে পারে। উদাহরণস্বরূপ, একটি নতুন ফাইলlib.rsতৈরি করুন:// src/lib.rs pub fn say_hello() { println!("Hello from the library!"); }এক্সিকিউটেবল অংশ যোগ করা:
src/main.rsফাইলে এভাবে এক্সিকিউটেবল অংশ লেখুন:// src/main.rs use my_project::say_hello; fn main() { say_hello(); }ক্রেট রান করা:
ক্রেট রান করতেcargo runকমান্ড ব্যবহার করুন:cargo run
এখানে my_project একটি ক্রেট যার মধ্যে src/lib.rs এবং src/main.rs ফাইল রয়েছে। lib.rs লাইব্রেরি ফাংশন সরবরাহ করে এবং main.rs এ সেই ফাংশন ব্যবহার করা হচ্ছে।
ক্রেটের প্রধান উপাদানসমূহ:
Cargo.toml: এটি ক্রেটের ম্যানিফেস্ট ফাইল, যেখানে ক্রেটের ডিপেনডেন্সি, সংস্করণ, এবং অন্যান্য মেটা তথ্য রাখা হয়।
উদাহরণ:
[dependencies] rand = "0.8"
এখানে rand ক্রেটটি আপনার প্রোজেক্টে ডিপেনডেন্সি হিসেবে যোগ করা হয়েছে। রাস্টের ক্রেট রেজিস্ট্রি crates.io থেকে এই ডিপেনডেন্সি ব্যবহার করা যেতে পারে।
Modules এবং Crates এর মধ্যে সম্পর্ক
- Modules হল একটি ক্রেটের কোডের ভিতরে কোড সংগঠনের উপায়। একে আপনি একটি ক্রেটের মধ্যে পাবেন যা বিভিন্ন মডিউল দ্বারা বিভক্ত।
- Crates হল পূর্ণাঙ্গ প্রোগ্রাম বা লাইব্রেরি যা একাধিক মডিউল অন্তর্ভুক্ত করতে পারে এবং একটি বড় কোডবেস ধারণ করে।
উদাহরণ:
আপনি একটি লাইব্রেরি ক্রেট তৈরি করতে পারেন যা বিভিন্ন মডিউল অন্তর্ভুক্ত করবে এবং সেই লাইব্রেরি অন্য প্রোগ্রামে ব্যবহৃত হবে।
সারাংশ
- Modules (মডিউলস) রাস্টে কোডকে সংগঠিত করার একটি উপায় যা বিভিন্ন ফাংশন, স্ট্রাকচার এবং অন্যান্য আইটেমকে একত্রিত করে।
- Crates (ক্রেটস) হল কোডের একটি ইউনিট, যা একটি লাইব্রেরি বা এক্সিকিউটেবল হতে পারে এবং এটি
Cargoদ্বারা ব্যবস্থাপিত হয়। - রাস্টে Modules কোডের ভিতরে ব্যবহৃত হয়, যেখানে Crates সাধারণত কোডের বৃহত্তর অংশ হিসাবে ব্যবহৃত হয়, যা বিভিন্ন মডিউল অন্তর্ভুক্ত করতে পারে।
Modules (মডিউল)
রাস্টে Modules একটি কোডকে সংগঠিত করার এবং ভিন্ন অংশে বিভক্ত করার জন্য ব্যবহৃত হয়। মডিউলগুলি ফাংশন, স্ট্রাকচার, এনাম, ট্রেইট, এবং অন্যান্য কোড উপাদানগুলি একত্রে গ্রুপ করে। এটি কোডের পাঠযোগ্যতা এবং রিইউজেবিলিটি উন্নত করতে সাহায্য করে এবং কোডের ভেতরে স্কোপ তৈরি করে যাতে গ্লোবাল নামের কনফ্লিক্ট এড়ানো যায়।
১.১ মডিউল তৈরি
রাস্টে মডিউল তৈরি করার জন্য mod কিওয়ার্ড ব্যবহার করা হয়। একটি মডিউল সাধারণত এক বা একাধিক ফাইলের মধ্যে বিভক্ত হতে পারে।
উদাহরণ (মডিউল তৈরি):
mod math {
pub fn add(x: i32, y: i32) -> i32 {
x + y
}
pub fn subtract(x: i32, y: i32) -> i32 {
x - y
}
}
fn main() {
let result = math::add(5, 3); // math মডিউলের add ফাংশন কল
println!("The result is: {}", result);
}এখানে, math একটি মডিউল যা দুটি পাবলিক ফাংশন add এবং subtract ধারণ করে। pub কিওয়ার্ডটি মডিউল উপাদানগুলিকে পাবলিক করে তোলে, অর্থাৎ এই ফাংশনগুলো বাইরের স্কোপে অ্যাক্সেস করা যাবে।
১.২ মডিউল এবং ফাইল সিস্টেম
রাস্টে মডিউলগুলি প্রায়ই ফাইল সিস্টেমের সাথে সম্পর্কিত থাকে। আপনি মডিউলকে আলাদা ফাইল হিসেবে বিভক্ত করতে পারেন:
- একটি মডিউল
math.rsনামের ফাইলে থাকতে পারে। - যদি একটি সাব-মডিউল থাকে, তাহলে এটি
mathফোল্ডারের মধ্যে একটিmod.rsফাইলে থাকতে পারে।
উদাহরণ (ফাইল ভিত্তিক মডিউল):
// main.rs
mod math;
fn main() {
let result = math::add(5, 3);
println!("The result is: {}", result);
}// math.rs
pub fn add(x: i32, y: i32) -> i32 {
x + y
}এখানে main.rs ফাইলে mod math; এর মাধ্যমে math.rs ফাইলটি অন্তর্ভুক্ত করা হয়েছে, এবং সেই ফাইল থেকে add ফাংশনটি ব্যবহার করা হয়েছে।
Namespaces (নেমস্পেস)
রাস্টে Namespaces একটি ব্যবস্থা যা নামের সংঘর্ষ থেকে রক্ষা পেতে সাহায্য করে। প্রতিটি মডিউল একটি আলাদা নেমস্পেস তৈরি করে, যেখানে একই নামের ফাংশন, স্ট্রাকচার, বা ভেরিয়েবল বিভিন্ন মডিউলে থাকতে পারে এবং একে অপরের সাথে সংঘর্ষ করবে না। এটি কোডের সংগঠন এবং পাঠযোগ্যতা বাড়াতে সাহায্য করে।
২.১ নেমস্পেসের ব্যবহার
নেমস্পেসের মাধ্যমে আপনি একই নামের উপাদানকে বিভিন্ন মডিউলে পৃথকভাবে ব্যবহার করতে পারেন। মডিউল এবং সাব-মডিউলগুলি নিজেদের মধ্যে আলাদা নেমস্পেস তৈরি করে, যা কোডের মধ্যে পরিষ্কারতা বজায় রাখতে সহায়তা করে।
উদাহরণ (নেমস্পেস ব্যবহার):
mod module_a {
pub fn greet() {
println!("Hello from Module A");
}
}
mod module_b {
pub fn greet() {
println!("Hello from Module B");
}
}
fn main() {
module_a::greet(); // Module A এর greet ফাংশন
module_b::greet(); // Module B এর greet ফাংশন
}এখানে module_a এবং module_b দুটি আলাদা মডিউল। প্রত্যেকটি মডিউল তাদের নিজস্ব greet ফাংশন ধারণ করছে। যেহেতু এই ফাংশন দুটি আলাদা নেমস্পেসে রয়েছে, তাই কোন একটির সাথে আরেকটির নামের সংঘর্ষ হচ্ছে না।
৩. মডিউল এবং নেমস্পেসের মধ্যে সম্পর্ক
রাস্টে মডিউল এবং নেমস্পেস একে অপরের সাথে ঘনিষ্ঠভাবে সম্পর্কিত। মডিউলগুলি নেমস্পেসের মতো কাজ করে এবং তাদের ভেতর সংজ্ঞায়িত সব উপাদানকে একটি আলাদা স্কোপে রাখে। এভাবে, এক মডিউল বা নেমস্পেসের উপাদান অন্য মডিউল বা নেমস্পেসের উপাদানের সাথে সংঘর্ষ করে না, এবং কোড আরও সংগঠিত থাকে।
৩.১ প্রক্সি/আলিয়াস ব্যবহার
নেমস্পেসের সাহায্যে আপনি একাধিক মডিউল বা উপাদানকে use কিওয়ার্ডের মাধ্যমে সহজেই একসাথে ব্যবহার করতে পারেন।
উদাহরণ (প্রক্সি বা আলিয়াস):
mod a {
pub fn hello() {
println!("Hello from module A");
}
}
mod b {
pub fn hello() {
println!("Hello from module B");
}
}
use a::hello as a_hello;
use b::hello as b_hello;
fn main() {
a_hello(); // Module A এর hello ফাংশন
b_hello(); // Module B এর hello ফাংশন
}এখানে, use কিওয়ার্ডের মাধ্যমে a::hello এবং b::hello কে আলিয়াস করা হয়েছে, যাতে তাদেরকে a_hello এবং b_hello নামে ব্যবহার করা যায়।
সারাংশ
- Modules হল রাস্টে কোড সংগঠিত করার একটি পদ্ধতি যা কোডের বিভাজন, পুনঃব্যবহারযোগ্যতা এবং গ্লোবাল নামের সংঘর্ষ এড়াতে সাহায্য করে।
- Namespaces একটি কাঠামো যা মডিউলগুলির মধ্যে আলাদা স্কোপ তৈরি করে, যেখানে একই নামের ফাংশন বা উপাদান একে অপরের সাথে সংঘর্ষ সৃষ্টি করে না।
- মডিউলগুলি একে অপরের মধ্যে নামের সংঘর্ষ এড়াতে সাহায্য করার জন্য নেমস্পেস হিসেবে কাজ করে।
Crates এবং Packages কী?
Rust-এ Crates এবং Packages দুটি অত্যন্ত গুরুত্বপূর্ণ ধারণা, যা কোডের পুনঃব্যবহারযোগ্যতা এবং সংগঠন নিশ্চিত করতে সাহায্য করে।
- Crate: একটি Crate হল Rust এর কোডের একটি একক ইউনিট। এটি হতে পারে একটি বাইনারি (যেমন একটি প্রোগ্রাম) অথবা একটি লাইব্রেরি (যা অন্যান্য কোডে ব্যবহার করা যেতে পারে)। একটি Crate একটি কন্টেইনার যা Rust কোডের সব ফাইল ধারণ করে।
- Package: একটি Package হল একটি বা একাধিক Crate নিয়ে গঠিত একটি প্যাকেজ, এবং এটি সাধারণত কোড ডিস্ট্রিবিউশনের জন্য ব্যবহৃত হয়। একটি Package কমপক্ষে একটি Crate ধারণ করে এবং একাধিক Crate থাকতে পারে (যেমন একটি লাইব্রেরি এবং একটি বাইনারি Crate একসাথে থাকতে পারে)।
Crates তৈরি করা
একটি Crate তৈরি করতে, আপনাকে একটি Rust প্রোজেক্ট তৈরি করতে হবে। এর মাধ্যমে আপনি একটি নতুন Crate তৈরি করবেন, যা আপনি বিভিন্ন কোড ফাইলের মাধ্যমে সাজাতে পারেন।
স্টেপ ১: Crate তৈরি করা
আপনি নতুন Crate তৈরি করতে cargo new কমান্ড ব্যবহার করতে পারেন। এই কমান্ডটি একটি নতুন ফোল্ডার তৈরি করবে যেখানে একটি নতুন Crate থাকবে।
বাইনারি Crate তৈরি করা:
cargo new my_crateএটি একটি my_crate নামক নতুন ডিরেক্টরি তৈরি করবে, যা একটি বাইনারি Crate থাকবে (এখানে একটি main.rs ফাইল থাকবে)।
লাইব্রেরি Crate তৈরি করা:
cargo new my_library --libএটি একটি my_library নামক নতুন লাইব্রেরি Crate তৈরি করবে, যেখানে একটি lib.rs ফাইল থাকবে।
স্ট্রাকচার:
যখন আপনি একটি বাইনারি Crate তৈরি করেন, এটি সাধারণত src/main.rs ফাইলে থাকে, এবং যখন আপনি একটি লাইব্রেরি Crate তৈরি করেন, এটি src/lib.rs ফাইলে থাকে।
Crates.io তে Crate আপলোড করা
Rust এর পাবলিক প্যাকেজ রেজিস্ট্রি crates.io তে আপনার Crate আপলোড করা সহজ। এটি একটি খোলা সোর্স রেজিস্ট্রি যেখানে আপনি আপনার লাইব্রেরি বা Crate প্রকাশ করতে পারেন এবং অন্যান্য ডেভেলপাররা তা ব্যবহার করতে পারে।
স্টেপ ১: Cargo.toml কনফিগারেশন
Cargo.toml ফাইলের মধ্যে আপনার প্যাকেজের তথ্য যেমন নাম, সংস্করণ, এবং ডিপেন্ডেন্সি থাকতে হবে। উদাহরণস্বরূপ:
[package]
name = "my_crate"
version = "0.1.0"
edition = "2018"
[dependencies]স্টেপ ২: Crate আপলোড করা
আপনি cargo publish কমান্ড ব্যবহার করে আপনার Crate crates.io তে আপলোড করতে পারেন।
cargo publishএটি আপনার Crate প্যাকেজটি crates.io তে আপলোড করবে, এবং অন্যান্য ডেভেলপাররা এটি ব্যবহার করতে পারবে।
Packages তৈরি করা
একটি Package হল একটি বা একাধিক Crate নিয়ে গঠিত। আপনি যদি একাধিক Crate চান (যেমন একটি লাইব্রেরি Crate এবং একাধিক বাইনারি Crate একসাথে), আপনি একটি Package তৈরি করতে পারেন।
স্ট্রাকচার:
একটি Package এর স্ট্রাকচার সাধারণত এভাবে দেখাবে:
my_package/
Cargo.toml
src/
main.rs
lib.rsএখানে:
Cargo.toml: Package এর কনফিগারেশন ফাইল।src/main.rs: বাইনারি Crate।src/lib.rs: লাইব্রেরি Crate।
একাধিক Crate একসাথে ব্যবহার:
একটি Package তে একাধিক Crate ব্যবহার করতে চাইলে, আপনি একাধিক Crate তৈরি করতে পারেন এবং তাদের Cargo.toml এর মধ্যে উল্লেখ করতে পারেন।
Crate এর ডিপেন্ডেন্সি ব্যবস্থাপনা
Rust এ প্যাকেজ ব্যবস্থাপনা অত্যন্ত সহজ। আপনি যদি আপনার Crate বা Package এর ডিপেন্ডেন্সি যোগ করতে চান, তবে আপনি সহজেই Cargo.toml ফাইলের মধ্যে তা উল্লেখ করতে পারেন।
উদাহরণ:
[dependencies]
serde = "1.0"এখানে serde একটি জনপ্রিয় Rust লাইব্রেরি এবং এটি একটি ডিপেন্ডেন্সি হিসাবে আপনার প্রোজেক্টে ব্যবহার করা হয়েছে।
ব্যবহারকারী লাইব্রেরি Crate
যখন আপনি একটি লাইব্রেরি Crate তৈরি করেন, অন্যরা সেই লাইব্রেরি ব্যবহার করতে পারে। তাদের Cargo.toml ফাইলে লাইব্রেরি উল্লেখ করে তারা আপনার Crate ব্যবহার করতে পারবে।
[dependencies]
my_library = { path = "../my_library" }এটি স্থানীয়ভাবে আপনার লাইব্রেরি যুক্ত করবে।
সারাংশ
Rust-এ Crates এবং Packages তৈরি করা অত্যন্ত সহজ এবং শক্তিশালী। Crates হল কোডের মূল ইউনিট, এবং একাধিক Crate নিয়ে গঠিত একটি Package একটি একক প্যাকেজ হিসেবে কাজ করতে পারে। Crates.io তে আপনার Crate আপলোড করা এবং প্যাকেজ ব্যবস্থাপনা করা সহজ, এবং এর মাধ্যমে আপনার কোডকে পুনঃব্যবহারযোগ্য এবং শেয়ারযোগ্য করে তুলতে পারবেন।
External Crates কী?
Rust-এ external crates হল বাইরের লাইব্রেরি বা প্যাকেজ যা আপনি আপনার প্রকল্পে ব্যবহার করতে পারেন। এই ক্রেটসগুলি অন্য ডেভেলপারদের দ্বারা তৈরি করা হয় এবং তারা আপনাকে অতিরিক্ত কার্যকারিতা যোগ করার সুযোগ দেয়, যেমন নেটওয়ার্কিং, ডেটাবেস অ্যাক্সেস, সিরিয়ালাইজেশন ইত্যাদি।
এগুলি সাধারণত crates.io তে সংরক্ষিত থাকে, যা Rust এর অফিসিয়াল প্যাকেজ রেজিস্ট্রি।
Cargo এবং External Crates
Cargo হল Rust এর অফিসিয়াল প্যাকেজ ম্যানেজার এবং বিল্ড সিস্টেম, যা external crates ব্যবহারের জন্য একটি সহজ পদ্ধতি প্রদান করে। Cargo দিয়ে আপনি ডিপেন্ডেন্সি ম্যানেজ করতে, ক্রেট ইনস্টল করতে এবং আপনার প্রোজেক্টের জন্য প্যাকেজ তৈরি করতে পারেন।
External Crates ব্যবহার করার জন্য পদক্ষেপ
১. Crate যুক্ত করা
আপনার প্রকল্পে একটি external crate যোগ করতে আপনাকে Cargo.toml ফাইলে সেই ক্রেটের নাম এবং সংস্করণ উল্লেখ করতে হবে।
ধরা যাক, আপনি rand ক্রেটটি ব্যবহার করতে চান, যা র্যান্ডম নাম্বার জেনারেট করতে সাহায্য করে।
প্রথমে, আপনার Cargo.toml ফাইলে নিচের মতো ডিপেন্ডেন্সি যোগ করুন:
[dependencies]
rand = "0.8"এখানে, rand ক্রেটের সংস্করণ "0.8" উল্লেখ করা হয়েছে।
২. Cargo দ্বারা Crate ইনস্টল করা
এখন, Cargo এর মাধ্যমে আপনার ডিপেন্ডেন্সি ইনস্টল করতে হবে:
cargo buildএই কমান্ডটি সমস্ত ডিপেন্ডেন্সি ডাউনলোড করে এবং আপনার প্রকল্পের বিল্ড শুরু করে।
৩. Crate ব্যবহার করা
একবার rand ক্রেট ইনস্টল হলে, আপনি এটি ব্যবহার করতে পারেন:
use rand::Rng;
fn main() {
let mut rng = rand::thread_rng();
let n: u8 = rng.gen_range(1..101); // 1 থেকে 100 এর মধ্যে র্যান্ডম সংখ্যা
println!("Random number: {}", n);
}এখানে, rand::Rng ট্রেইট ব্যবহার করে আপনি একটি র্যান্ডম নাম্বার জেনারেট করছেন এবং সেটি আউটপুট করছেন।
External Crates এর অন্যান্য ব্যবহার
ডিপেন্ডেন্সি সংস্করণ নিয়ন্ত্রণ
আপনি ক্রেটের সংস্করণ নিয়ন্ত্রণ করতে পারেন, যেমন:
[dependencies]
rand = "0.8"
serde = { version = "1.0", features = ["derive"] }এখানে, serde ক্রেটের জন্য derive ফিচারও সক্রিয় করা হয়েছে।
ক্রেটের নির্দিষ্ট বৈশিষ্ট্য ব্যবহার করা
অনেক ক্রেট কিছু নির্দিষ্ট বৈশিষ্ট্য বা ফিচার প্রদান করে, যা আপনি Cargo.toml এ উল্লেখ করে সক্ষম করতে পারেন। যেমন, serde ক্রেটের derive ফিচার:
[dependencies]
serde = { version = "1.0", features = ["derive"] }Crate সংস্করণ সঠিকভাবে নির্বাচন করা
আপনি ক্রেটের একটি নির্দিষ্ট সংস্করণ বা একটি ভার্সন রেঞ্জও নির্বাচন করতে পারেন:
[dependencies]
rand = "0.8" # 0.8.x এর মধ্যে যে কোনো সংস্করণ
serde = "1.0" # 1.0.x এর মধ্যে যে কোনো সংস্করণডেভেলপমেন্ট ডিপেন্ডেন্সি
যদি আপনি একটি ক্রেট শুধুমাত্র ডেভেলপমেন্টের জন্য ব্যবহার করতে চান (যেমন টেস্টিং বা বেন্চমার্কিং), তাহলে আপনি এটি dev-dependencies হিসেবে উল্লেখ করতে পারেন:
[dev-dependencies]
criterion = "0.3" # টেস্টিং লাইব্রেরিCargo এর কিছু গুরুত্বপূর্ণ কমান্ড
cargo new <project_name>
একটি নতুন Rust প্রকল্প তৈরি করা।cargo build
প্রকল্প কম্পাইল করা এবং ডিপেন্ডেন্সি ডাউনলোড করা।cargo run
প্রকল্প রান করা।cargo test
টেস্ট চালানো।cargo update
ডিপেন্ডেন্সি আপডেট করা।cargo clean
কম্পাইল করা ফাইল এবং ডিপেন্ডেন্সি পরিষ্কার করা।cargo doc
ডকুমেন্টেশন তৈরি করা।cargo publish
আপনার ক্রেটটিcrates.ioতে আপলোড করা।
সারাংশ
Cargo এবং External Crates Rust ডেভেলপমেন্টের জন্য অত্যন্ত গুরুত্বপূর্ণ টুল। Cargo ব্যবহার করে আপনি আপনার প্রোজেক্টের ডিপেন্ডেন্সি ম্যানেজ করতে পারেন এবং external crates এর মাধ্যমে আপনার প্রোজেক্টে অতিরিক্ত কার্যকারিতা যোগ করতে পারেন। এটি ডেভেলপারদের জন্য দ্রুত এবং কার্যকরী কোড তৈরি করতে সাহায্য করে।
Project Organization in Rust
Rust প্রোজেক্টের সঠিক সংগঠন নিশ্চিত করার জন্য কিছু প্রাথমিক নির্দেশিকা এবং কাঠামো আছে, যা আপনার কোডকে পরিষ্কার, মেইনটেইনেবল এবং স্কেলেবল করে তোলে। Rust প্রোজেক্টে সাধারণত দুটি প্রধান উপাদান থাকে: src (source code) এবং Cargo.toml।
একটি সাধারণ Rust প্রোজেক্ট কাঠামো:
my_project/
│
├── Cargo.toml # প্রকল্পের কনফিগারেশন ফাইল
├── Cargo.lock # নির্দিষ্ট ডিপেন্ডেন্সি সংস্করণগুলির তালিকা
└── src/ # সোর্স কোড
├── main.rs # প্রধান ফাইল
└── lib.rs # লাইব্রেরি কোড (যদি থাকে)- Cargo.toml: এটি আপনার প্রকল্পের ডিপেন্ডেন্সি, সংস্করণ এবং অন্যান্য কনফিগারেশন ধারণ করে।
- Cargo.lock: এটি নিশ্চিত করে যে, প্রকল্পটি যখন পুনরায় বিল্ড হবে, তখন নির্দিষ্ট সংস্করণগুলির ডিপেন্ডেন্সি ব্যবহৃত হবে।
- src/: এই ফোল্ডারে সমস্ত সোর্স কোড থাকবে। সাধারণত,
main.rsএ প্রধান কার্যকলাপ থাকে এবংlib.rsকোড লাইব্রেরি ফাংশনালিটি ধারণ করে।
কোড বিভাজন
Rust-এ আপনার কোডকে ছোট ছোট মডিউলে বিভক্ত করা সহজ, যা প্রোজেক্টের কাঠামো এবং মেইনটেনেবিলিটি উন্নত করে।
src/main.rs:
mod utils; // utils মডিউল ব্যবহার করা
use utils::greet;
fn main() {
greet();
}src/utils.rs:
pub fn greet() {
println!("Hello from utils!");
}এখানে, main.rs ফাইলটি utils.rs ফাইলের ফাংশন ব্যবহার করছে, যেখানে mod এবং use কীওয়ার্ড ব্যবহার করা হয়েছে।
Workspace ম্যানেজমেন্ট in Rust
Workspaces Rust-এ একাধিক ক্রেট একসাথে পরিচালনা করার জন্য ব্যবহৃত হয়। একাধিক ক্রেট নিয়ে কাজ করার জন্য আপনি একাধিক ক্রেট একটি একক রুট ডিরেক্টর বা workspace-এ সংযুক্ত করতে পারেন। এটি একাধিক প্রোজেক্টকে একসাথে ম্যানেজ করতে এবং ডিপেন্ডেন্সি শেয়ার করতে সহায়ক হয়।
Workspace স্ট্রাকচার:
Rust workspace-এর কাঠামো সাধারণত এরকম হতে পারে:
my_workspace/
│
├── Cargo.toml # Workspace কনফিগারেশন ফাইল
├── crate1/ # প্রথম ক্রেট
│ ├── Cargo.toml
│ └── src/
├── crate2/ # দ্বিতীয় ক্রেট
│ ├── Cargo.toml
│ └── src/
└── crate3/ # তৃতীয় ক্রেট
├── Cargo.toml
└── src/Workspace কনফিগারেশন:
আপনি যখন একাধিক ক্রেট ব্যবহার করছেন, তখন রুট Cargo.toml ফাইলে আপনার workspace কনফিগারেশন উল্লেখ করতে হবে:
[workspace]
members = [
"crate1",
"crate2",
"crate3"
]এখানে, crate1, crate2, এবং crate3 তিনটি ক্রেটের অংশ। এই ক্রেটগুলির মধ্যে ডিপেন্ডেন্সি শেয়ার করতে পারবেন এবং একযোগে বিল্ড করতে পারবেন।
Workspace ব্যবহারের সুবিধা:
- একক বিল্ড: একটি
cargo buildকমান্ডের মাধ্যমে একাধিক ক্রেট বিল্ড করা যায়। - শেয়ারড ডিপেন্ডেন্সি: একাধিক ক্রেটের মধ্যে ডিপেন্ডেন্সি শেয়ার করতে পারেন, যা বিল্ড টাইম কমিয়ে দেয়।
- কোডের পুনঃব্যবহার: একাধিক ক্রেটের মধ্যে কোড শেয়ার করা যায়, যেমন লাইব্রেরি ক্রেট।
Workspace এর মধ্যে ক্রেটের ডিপেন্ডেন্সি
যখন আপনি একাধিক ক্রেট ব্যবহার করছেন, তখন আপনি তাদের মধ্যে ডিপেন্ডেন্সি শেয়ার করতে পারেন।
উদাহরণ:
ধরা যাক, crate1 এবং crate2 একটি共同 লাইব্রেরি বা ফাংশন শেয়ার করছে। এই পরিস্থিতিতে crate2-এর Cargo.toml ফাইলে crate1-কে ডিপেন্ডেন্সি হিসেবে উল্লেখ করবেন।
crate2/Cargo.toml:
[dependencies]
crate1 = { path = "../crate1" }এখন, crate2 crate1-এর ফাংশন ব্যবহার করতে পারবে।
Workspace ম্যানেজমেন্টের কমান্ড
cargo build
সব ক্রেট একসাথে বিল্ড করবে, যখন আপনি workspace ডিরেক্টরিতে চলে যাবেন।cargo test
সকল ক্রেটের টেস্ট একসাথে চালাবে।cargo run
শুধু বর্তমান ক্রেট চালাবে, যদি আপনি একটি নির্দিষ্ট ক্রেট রান করতে চান।
সারাংশ
Rust প্রোজেক্টের সংগঠন একটি গুরুত্বপূর্ণ বিষয় যা কোডের পরিস্কার এবং মেইনটেনেবিলিটি নিশ্চিত করে। Workspaces এর মাধ্যমে আপনি একাধিক ক্রেটকে একত্রে পরিচালনা করতে পারেন এবং ডিপেন্ডেন্সি শেয়ার করতে পারেন। এটি বড় প্রোজেক্টে কাজ করা সহজ করে তোলে এবং বিভিন্ন ক্রেটের মধ্যে কোড পুনঃব্যবহার সম্ভব করে। Cargo এবং Workspaces ব্যবহারের মাধ্যমে আপনার Rust প্রকল্পকে আরো কার্যকরভাবে পরিচালনা করা সম্ভব।
Read more