30 Ngày học Rust - Day 8: Quản lý dự án với Packages, Crates và Modules
Day 8: Tổ chức codebase đồ sộ. Mở khóa bí ẩn về cách Rust sắp xếp file và thư mục thông qua kiến trúc Module Tree. Sự khác biệt giữa Crate và Package.

Lộ trinh thoạt khỏi File main.rs nghìn dòng
Khi dự án Web hay Game của bạn phình tên từ vài trăm lên vài chục nghìn dòng tệp, chèn nhét tất cả logic vào main.rs chằng khác nào tự đào mồ chôn code. Các ngôn ngữ như Java và C# sử dụng thư mục theo đường dẫn Folder trên đĩa cứng làm cấu trúc namespace. JavaScript sử dụng hệ thống Import/Export.
Còn Rust? Nó có một cỗ thần kỳ riêng gọi là Mô hình Cây Module Tree. Và nó không chịu chi phối bởi việc bạn ném File vào ổ cứng!
1. Giải phẫu hệ sinh thái The Module System
Để giao tiếp chuẩn như một kỹ sư Rust thực thụ, bạn phải phân biệt 4 thuật ngữ bùa chú:
- Packages (Gói chứa hàng): Là cái Box ngoài cùng chứa file
Cargo.toml. Nó là toàn bộ project của bạn. - Crates (Thùng hàng): Một Package có thể chứa 1 Library Crate chuyên dùng để chia sẻ, và chứa N-đống Binary Crate chuyên dùng xuất xưởng file
.exe. - Modules (Các ngăn nhỏ): Ngăn cho phép bạn kiểm soát Tầm Vực, Nhóm Code liên quan, và Thiết lập Quyền (Quyền riêng tư Private vs Công khai Public).
- Paths (Đường bưu cục): Tên định tuyến (VD:
std::cmp::Ordering) báo cho hệ thống hiểu hàm đó đang giấu ở đâu trong Cây.
2. Quản lý Quyền Công Khai bằng pub
Mặc định, 100% mọi thứ trong Rust đều là Private (Kín). Nếu Mod B nằm trong Mod A, thì tụi ngoài Mod A không thấy được hàm bên trong B. Bức tường này phải được gỡ bỏ bằng giấy phép pub (Public).
mod restaurant {
// Để bên ngoài menu gọi được nhà hàng, Front_of_house phải pub
pub mod front_of_house {
pub fn them_ho(ho_ten: &str) {}
fn an_gi_do() {} // Vẫn Private nhé! Cấm bên ngoài xài
}
}
pub fn an_toi_nay() {
// Đường dẫn tuyệt đối đâm từ đầu rễ cái cây (crate)
crate::restaurant::front_of_house::them_ho("Nam");
}Hãy nhớ rằng: Nếu gắn pub cho Struct, các cánh cửa bên ngoài vẫn đóng kín các Variable nằm THUỘC TÍNH (Field) phía trong Struct đó. Phải nhồi thêm pub vô từng Variable con. Thiết kế An Toàn By Default!
3. Khai báo sử dụng file với use và mod
Trong Node.js (JS): Mọi thứ trong File là cục bộ, bạn ghi require('./my_file'). Trong Rust: Quá trình phân tách file vô cùng độc quyền. Trình biên dịch sẽ CHỈ BẮT TỰ ĐỘNG ĐỌC tệp main.rs (Hoặc lib.rs). Nếu bạn tạo tệp front_house.rs, Rust sẽ Phớt lờ như không khí!
Để chèn file đó vào cây sơ đồ biên dịch, bạn phải KHAI BÁO CÂY CHO main.rs:
// Trong main.rs
mod front_house; // Lệnh này bảo: Ê Rust, qua cái file front_house.rs lấy code bọc vô cho tao một cái TÊN là front_house
fn main() {
front_house::mo_cua_ban();
}Rút gọn tên đường dải rác bằng lệnh use:
use std::collections::HashMap; // Đem hàm mảng bảng vô trung tâm xài luôn 1 phát
let mut map = HashMap::new();Câu hỏi thường gặp (FAQ)
Tại sao lại chia Crate Binary (Ứng dụng chạy) và Library (Thư viện gói)?
Trường phái chuyên nghiệp khi thiết lập Rust Backend là: Họ tạo 1 file mỏng te main.rs ở Binary Crate chỉ chứa nút công tắc mở nguồn. Toàn bộ ruột DB, Logic Controller thì họ vứt vô Library Crate. Mô hình siêu sạch sẽ và sau này có đem tái chế thành App Command Line hay Test tự động cũng rực rỡ, dễ bới tìm.
Sức mạnh của Cargo Workspace là gì?
Ở bài Ngày 22, chúng ta sẽ đụng Workspace. Khi cả Công ty chia App ra thành 5-7 Packages siêu lằng nhằng, Workspace nén tất cả chạy trong chung 1 folder Lõi đùng (chung version Cargo.lock). Các Package nhỏ gọi Module vòng vèo của nhau siêu mượt y như 1 thư mục! Monorepo siêu đỉnh.
Sẵn sàng cho Ngày 9? Bây giờ chèn ép code thành kiến trúc ổn định. Đã đến lúc chúng ta bốc gánh khối dữ liệu khổng lồ đẩy vô Array List thay vì biến Array tĩnh giới hạn đồ bộ nhớ cổ điển. Tiếng chuông cho [Day 9: Các bộ sưu tập chung (Vectors, Strings, Hash Maps)].
Chuỗi bài viết
30 Ngày Trở Thành Rustacean Tinh Hoa
Phần 8 / 30
- Phần 1 30 Ngày học Rust - Day 1: Lời chào thế giới và Vũ khí Cargo
- Phần 2 30 Ngày học Rust - Day 2: Biến, Bất biến (Mutability) và Shadowing
- Phần 3 30 Ngày học Rust - Day 3: Luồng điều khiển (Control Flow) và sức mạnh của Match
- Phần 4 30 Ngày học Rust - Day 4: Ownership - Khái niệm định hình cỗ thần khí Rust
- Phần 5 30 Ngày học Rust - Day 5: Khóa học nhặt đồ chung với References & Borrowing
- Phần 6 30 Ngày học Rust - Day 6: Đắp nặn dự án với Structs và Methods
- Phần 7 30 Ngày học Rust - Day 7: Quyền năng vô song của Enums và Pattern Matching
- Phần 8 30 Ngày học Rust - Day 8: Quản lý dự án với Packages, Crates và Modules
- Phần 9 30 Ngày học Rust - Day 9: Các bộ sưu tập chung (Vectors, Strings, Hash Maps)
- Phần 10 30 Ngày học Rust - Day 10: Trị dứt điểm Ác mộng Lỗi (Error Handling)
- Phần 11 30 Ngày học Rust - Day 11: Generics - Ma thuật Đa hình kiểu dữ liệu
- Phần 12 30 Ngày học Rust - Day 12: Traits - Kẻ ban phát quyền năng và Lập pháp Hành vi
- Phần 13 30 Ngày học Rust - Day 13: Vượt qua Boss cuối 'Lifetimes' - Sinh Mệnh Biến
- Phần 14 30 Ngày học Rust - Day 14: Tận diệt Bug từ trứng nước bằng Automated Tests
- Phần 15 30 Ngày học Rust - Day 15: Thực chiến Build Command Line App (CLI) đầu đời
- Phần 16 30 Ngày học Rust - Day 16: Functional Magic chốn trần gian (Closures & Iterators)
- Phần 17 30 Ngày học Rust - Day 17: Quyền năng của Smart Pointers
- Phần 18 30 Ngày học Rust - Day 18: Chinh phục Da luồng (Concurrency) - Cú đâm quyết định của Rust
- Phần 19 30 Ngày học Rust - Day 19: Tranh cãi Lập trình hướng đối tượng (OOP) trong Rust
- Phần 20 30 Ngày học Rust - Day 20: Mổ xẻ nghệ thuật Advanced Pattern Matching
- Phần 21 30 Ngày học Rust - Day 21: Sức mạnh tối thượng của Advanced Traits
- Phần 22 30 Ngày học Rust - Day 22: Về Phe Bóng Tối với Unsafe Rust
- Phần 23 30 Ngày học Rust - Day 23: Quyền năng của Đấng Tạo Hóa (Declarative Macros)
- Phần 24 30 Ngày học Rust - Day 24: Siêu Năng Lực Procedural Macros (Macro Thủ Tục)
- Phần 25 30 Ngày học Rust - Day 25: Xây dựng TCP Web Server Đa Luồng (Phần 1: Lõi Socket)
- Phần 26 30 Ngày học Rust - Day 26: Xây dựng TCP Web Server Đa Luồng (Phần 2: Bắn trả File HTML)
- Phần 27 30 Ngày học Rust - Day 27: Xây dựng TCP Web Server Đa Luồng (Phần 3: The Thread Pool)
- Phần 28 30 Ngày học Rust - Day 28: Xây dựng TCP Web Server Đa Luồng (Phần 4: Graceful Shutdown)
- Phần 29 30 Ngày học Rust - Day 29: Lên đỉnh Web Server Thực Chiến với Axum và Tokio
- Phần 30 30 Ngày học Rust - Day 30: Vượt Vọng Vàng - Đúc Kết Hành Trình Rustacean Tinh Hoa