ข้ามไปยังเนื้อหา

Cargo — Package Manager & Build Tool ของ Rust

ถ้าเคยใช้ npm (หรือ yarn/pnpm) มาก่อน Cargo จะคุ้นมือทันที เพราะจัดการ dependency, build project, รันโค้ดและรัน test ได้ครบในตัวเดียว

Terminal window
# Node / TypeScript
mkdir my-app && cd my-app
npm init -y
npm install typescript --save-dev
# Rust
cargo new my-app # สร้าง binary (มี fn main)
cargo new my-lib --lib # สร้าง library (ไม่มี fn main)
cd my-app

cargo new สร้างโครงสร้าง:

flowchart TD
  root["my-app/"] --> toml["Cargo.toml — like package.json"]
  root --> lock["Cargo.lock — like package-lock.json"]
  root --> src["src/"]
  src --> main["main.rs — entry point"]
What cargo new creates
TypeScript
// package.json
{
"name": "my-app",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.0"
},
"devDependencies": {
"typescript": "^5.0.0",
"@types/express": "^4.17.0"
}
}
Rust
# Cargo.toml
[package]
name = "my-app"
version = "0.1.0"
edition = "2021"
[dependencies]
axum = "0.7"
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
[dev-dependencies]
# crate สำหรับ test เท่านั้นใส่ที่นี่
Terminal window
# npm
npm install serde_json # runtime dep
npm install --save-dev vitest # dev dep
# Cargo
cargo add serde_json # runtime dep
cargo add --dev pretty_assertions # dev dep

cargo add อัปเดต Cargo.toml อัตโนมัติ เหมือนกับ npm install ทุกประการ

Terminal window
cargo build # compile (debug, เร็ว, ไม่ optimise)
cargo build --release # compile (optimise, build ช้ากว่า)
cargo run # compile + execute
cargo run -- --port 8080 # ส่ง args ให้ binary
cargo check # type-check เท่านั้น ไม่สร้าง binary (เร็วมาก)
cargo test # รัน test ทั้งหมด
cargo test my_fn # รัน test ที่ชื่อมี "my_fn"
cargo doc --open # สร้าง + เปิด HTML docs
cargo clean # ลบ directory target/
# Binary / application → COMMIT Cargo.lock (build ที่ reproducible)
# Library crate → ไม่ commit Cargo.lock (ให้ผู้ใช้เลือก version)

นี่สอดคล้องกับ convention ของ npm: application commit package-lock.json แต่ library ที่ publish มักไม่ commit

Command ใดเพิ่ม crate ลงใน project (เทียบเท่า `npm install <pkg>`)?
`cargo check` ต่างจาก `cargo build` อย่างไร?
ควร commit Cargo.lock สำหรับ binary application หรือไม่?
File ใดใน Cargo คล้าย package.json มากที่สุด?