পাঠ ১.৩

Hello, Cargo!

Hello, Cargo!

আগের পাঠে rustc দিয়ে সরাসরি একটা file compile করেছিলাম। কিন্তু real-world Rust project-এ সবাই Cargo ব্যবহার করে। Cargo হলো Rust-এর build system এবং package manager — code build করা, dependency download করা, dependency-গুলো build করা — সব এই একটা tool-ই করে।

Cargo install আছে কিনা check করো

rustup দিয়ে Rust install করলে Cargo স্বয়ংক্রিয়ভাবে install হয়। নিশ্চিত হতে এই command চালাও:

terminalbash
$ cargo --version

version number দেখলে বুঝবে install আছে। না থাকলে আগের পাঠে ফিরে গিয়ে rustup install করে নাও।

Cargo দিয়ে নতুন project

নতুন একটা project বানাতে cargo new use করো:

terminalbash
$ cargo new hello_cargo
$ cd hello_cargo

এই command একটা hello_cargo নামের folder তৈরি করে। ভিতরে গিয়ে ls (Linux/macOS) বা dir (Windows) চালালে দেখবে:

  • Cargo.toml — project-এর configuration file।
  • src/ — source code-এর folder, ভিতরে একটা main.rs file।
  • একটা .gitignore file এবং নতুন একটা git repository initialize হয়েছে।

তুমি যদি আগে থেকেই কোনো git repo-এর ভিতরে থাকো, তাহলে cargo নতুন repo বানাবে না। অন্য VCS use করতে চাইলে cargo new --vcs=git বা --vcs=none flag দিতে পারো।

Cargo.toml-এ কী আছে

Cargo.toml file খুললে এই content দেখবে:

Cargo.tomltoml
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2024"

[dependencies]

.toml extension-টা TOML format-এর জন্য — Cargo এই format-এ configuration লেখে। এখানে দুটো section আছে:

  • [package] — তোমার package-এর metadata: নাম, version, এবং কোন Rust edition use করছ (edition নিয়ে বিস্তারিত Appendix E-তে)।
  • [dependencies] — অন্য যেসব crate-এর উপর তোমার project depend করবে, সেগুলো এখানে list করবে। Rust-এ library-কে crate বলে।

src/main.rs-এ কী আছে

src/main.rs খুলে দেখো — Cargo default-এ একটা "Hello, world!" program তৈরি করে দিয়েছে:

src/main.rsrust
fn main() {
    println!("Hello, world!");
}

লক্ষ্য করো — সব source file src/ folder-এ থাকে। Top-level folder (যেখানে Cargo.toml আছে) শুধু README, license, এবং অন্যান্য configuration-এর জন্য। এই structure প্রায় সব Rust project-এই follow করা হয়।

Project build করা

Project folder-এর ভিতরে থেকে এই command চালাও:

terminalbash
$ cargo build
   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs

এটা executable file বানায় target/debug/hello_cargo-তে (Windows-এ target\\debug\\hello_cargo.exe)। Default build হলো debug build — দ্রুত compile হয়, কিন্তু optimization কম।

প্রথমবার build করলে Cargo top-level-এ একটা Cargo.lock file তৈরি করে — এটা তোমার dependency-গুলোর exact version track করে। এই file Cargo নিজেই manage করে, তোমাকে কখনো hand-edit করতে হবে না।

Binary সরাসরি execute করতে:

terminalbash
$ ./target/debug/hello_cargo
Hello, world!

cargo run — build + execute এক command-এ

সাধারণত আমরা build আর execute একসাথেই করি। Cargo-এ এর জন্য একটা shortcut আছে:

terminalbash
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `target/debug/hello_cargo`
Hello, world!

লক্ষ্য করো — দ্বিতীয় বার cargo run চালানোয় Cargo "Compiling" message দেখায়নি। কারণ source file পরিবর্তন হয়নি, তাই recompile করার দরকার নেই। File-এ change করলে আবার compile হবে, তারপর run।

বেশিরভাগ Rust developer development-এর সময় cargo run ব্যবহার করে — দু'টো command মনে রাখার চেয়ে একটাই simpler।

cargo check — দ্রুত compile-error পরীক্ষা

লেখার সময় বারবার cargo build চালালে slow লাগতে পারে — কারণ executable বানানো একটা সময়সাপেক্ষ step। শুধু "code compile হয় কিনা" check করতে চাইলে:

terminalbash
$ cargo check
   Checking hello_cargo v0.1.0 (file:///projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs

cargo check compile করে কিন্তু executable produce করে না — তাই অনেক দ্রুত। লিখতে লিখতে বারবার এটা চালাতে পারো, আর যখন আসলে run করতে হবে তখন cargo build বা cargo run

Release build

Project শেষ করে যখন end-user-কে দেওয়ার মতো optimized binary দরকার, তখন:

terminalbash
$ cargo build --release

এটা optimization on করে compile করে, এবং binary রাখে target/release/-এ (debug-এ না)। Compile time বেশি, কিন্তু resulting binary অনেক fast। Performance benchmark করতে চাইলে সবসময় release build use করবে — debug build-এর number misleading।

সংক্ষেপে:

  • dev profile — দ্রুত rebuild, frequent compile-এর জন্য।
  • release profile — optimization on, end-user-এর জন্য।

Existing project-কে Cargo-এ আনা

আগে থেকে যদি এমন কোনো Rust project থাকে যেটা cargo দিয়ে শুরু করা হয়নি, সেটাকেও cargo-এ convert করা যায়:

  1. সব source file src/ folder-এ সরাও।
  2. উপযুক্ত Cargo.toml file লেখো — অথবা cargo নিজেই বানিয়ে দিতে পারে:
terminalbash
$ cargo init

cargo init current folder-কেই project হিসেবে treat করে, নতুন folder বানায় না।

যেকোনো Rust project-এ এটা কাজ করে

Cargo-এর সবচেয়ে বড় সুবিধা — সব Rust project-এই একই command কাজ করে। GitHub থেকে কারো project clone করে এনেছ?

terminalbash
$ git clone example.org/someproject
$ cd someproject
$ cargo build

ব্যাস। Linux, macOS, Windows — সবখানে একই command, একই behavior। Cargo-এর full documentation আছে doc.rust-lang.org/cargo/-এ।

এই পাঠ থেকে যা শিখলে

  • Cargo = Rust-এর build system + package manager।
  • cargo new <name> দিয়ে নতুন project, cargo init দিয়ে existing folder-কে project করা।
  • Cargo.toml — TOML format-এ metadata/dependency; src/-এ source code।
  • cargo build — compile (debug, target/debug); cargo run — compile + execute; cargo check — শুধু check, executable নেই।
  • cargo build --release — optimized build, target/release-এ।
  • Rust-এ library-কে crate বলে — dependency-গুলো crate।