Cargo — Package Manager & Build Tool ของ Rust
Cargo คือ npm + tsc + jest ในเครื่องเดียว
หัวข้อที่มีชื่อว่า “Cargo คือ npm + tsc + jest ในเครื่องเดียว”ถ้าเคยใช้ npm (หรือ yarn/pnpm) มาก่อน Cargo จะคุ้นมือทันที เพราะจัดการ dependency, build project, รันโค้ดและรัน test ได้ครบในตัวเดียว
สร้าง project ใหม่
หัวข้อที่มีชื่อว่า “สร้าง project ใหม่”# Node / TypeScriptmkdir my-app && cd my-appnpm init -ynpm install typescript --save-dev
# Rustcargo new my-app # สร้าง binary (มี fn main)cargo new my-lib --lib # สร้าง library (ไม่มี fn main)cd my-appcargo 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"]
Cargo.toml เทียบกับ package.json
หัวข้อที่มีชื่อว่า “Cargo.toml เทียบกับ package.json”// package.json{ "name": "my-app", "version": "1.0.0", "dependencies": { "express": "^4.18.0" }, "devDependencies": { "typescript": "^5.0.0", "@types/express": "^4.17.0" }}# 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 เท่านั้นใส่ที่นี่เพิ่ม dependencies
หัวข้อที่มีชื่อว่า “เพิ่ม dependencies”# npmnpm install serde_json # runtime depnpm install --save-dev vitest # dev dep
# Cargocargo add serde_json # runtime depcargo add --dev pretty_assertions # dev depcargo add อัปเดต Cargo.toml อัตโนมัติ เหมือนกับ npm install ทุกประการ
Subcommand หลัก
หัวข้อที่มีชื่อว่า “Subcommand หลัก”cargo build # compile (debug, เร็ว, ไม่ optimise)cargo build --release # compile (optimise, build ช้ากว่า)cargo run # compile + executecargo run -- --port 8080 # ส่ง args ให้ binarycargo check # type-check เท่านั้น ไม่สร้าง binary (เร็วมาก)cargo test # รัน test ทั้งหมดcargo test my_fn # รัน test ที่ชื่อมี "my_fn"cargo doc --open # สร้าง + เปิด HTML docscargo clean # ลบ directory target/Cargo.lock — commit หรือไม่?
หัวข้อที่มีชื่อว่า “Cargo.lock — commit หรือไม่?”# Binary / application → COMMIT Cargo.lock (build ที่ reproducible)# Library crate → ไม่ commit Cargo.lock (ให้ผู้ใช้เลือก version)นี่สอดคล้องกับ convention ของ npm: application commit package-lock.json แต่ library ที่ publish มักไม่ commit