Bỏ qua để đến nội dung

Công cụ và cài đặt Rust: mọi thứ bạn cần

Khi bắt đầu với Rust, bạn nghe một loạt cái tên mới cùng lúc: rustup, rustc, cargo, clippy, rustfmt, rust-analyzer. Cảm giác như phải có mười công cụ thì mới viết được một dòng code. Tin vui là: chỉ một trình cài đặt đã cho bạn gần như tất cả, và mỗi công cụ có một nhiệm vụ rõ ràng.

Hãy hình dung như một căn bếp. rustup là cửa hàng giao và thay dụng cụ cho bạn. cargo là đầu bếp điều hành mọi thứ. clippy là người thầy thân thiện đứng sau lưng góp ý, còn rustfmt giữ cho mặt bếp luôn gọn gàng. Trang này giải thích từng công cụ, hệ điều hành của bạn cần gì, và một lập trình viên Rust dùng chúng hằng ngày ra sao.

Nếu bạn chưa cài Rust, các bước cài đặt chi tiết và dự án đầu tiên nằm ở bài Bắt đầu với Rust. Những điều cơ bản về cargo (cargo new, cargo add, Cargo.toml) nằm ở bài Cargo và crate. Trang này xây tiếp trên cả hai.

Đây là toàn bộ hộp đồ nghề trong một bảng:

Công cụ Tác dụng Có sẵn khi cài rustup?
rustup Cài Rust, cập nhật nó và chuyển qua lại giữa các phiên bản Chính nó là trình cài đặt
rustc Trình biên dịch: biến các file .rs của bạn thành chương trình Có
cargo Build, chạy, test và thêm crate. Bạn dùng nó cho gần như mọi việc Có
rustup doc Mở tài liệu thư viện chuẩn và cuốn Rust Book ngoại tuyến trong trình duyệt Có (profile mặc định)
clippy Một linter: chỉ ra lỗi và những cách viết code đơn giản hơn Có (profile mặc định)
rustfmt Một công cụ định dạng: viết lại code của bạn theo phong cách chuẩn Có (profile mặc định)
rust-analyzer “Bộ não của editor”: gợi ý code, báo lỗi ngay trong editor, gợi ý kiểu, nhảy tới định nghĩa Không có sẵn mặc định. Extension VS Code tự mang theo bản riêng
Một debugger Dừng chương trình ở một dòng và xem các biến của nó Không. Bạn tự cài LLDB hoặc GDB (hoặc một extension editor có kèm debugger)

Một profile là một nhóm thành phần (component) mà rustup cài đặt. Cách cài thông thường dùng profile default, profile này thêm tài liệu, clippy và rustfmt bên cạnh trình biên dịch và cargo. Nếu ai đó cài máy cho bạn bằng profile minimal, cargo clippy sẽ báo là chưa được cài. Một lệnh là sửa được: rustup component add clippy rustfmt.

Hãy thử rustup doc --std một lần. Nó mở toàn bộ tài liệu thư viện chuẩn từ chính ổ đĩa của bạn, nên dùng được cả khi đang trên máy bay hay mạng chậm. Để xem tài liệu của dự án bạn và mọi crate nó dùng, hãy chạy cargo doc --open (xem thêm ở bài Tài liệu).

Trước khi cài: mỗi hệ điều hành cần gì

Phần tiêu đề “Trước khi cài: mỗi hệ điều hành cần gì”

Rust biên dịch code của bạn, nhưng ở bước cuối cùng nó cần một linker: chương trình ghép các mảnh đã biên dịch thành một file chạy được. Rust dùng linker mà bộ công cụ C của hệ thống cung cấp. Đó là lý do mỗi hệ điều hành cần thêm một bước nhỏ.

Hệ điều hành Cần cài gì Cách cài
Windows (khuyên dùng) Bộ công cụ C++ của Visual Studio: linker MSVC và Windows SDK Chọn workload Desktop development with C++ trong trình cài đặt Visual Studio
Windows (thay thế) Toolchain GNU (MinGW) rustup toolchain install stable-gnu
Windows (lựa chọn khác) WSL, một Linux thật chạy bên trong Windows wsl --install, rồi làm theo các bước cho Linux
macOS Bộ công cụ dòng lệnh của Apple (có trình biên dịch C và linker) xcode-select --install
Debian / Ubuntu Một trình biên dịch C và linker sudo apt install build-essential
Fedora Một trình biên dịch C và linker sudo dnf install gcc

Vài lưu ý thật lòng:

  • Windows và Visual Studio. Bạn không cần tự đi tìm: nếu thiếu Visual Studio, rustup-init.exe sẽ đề nghị cài nó cho bạn. Nó cài Visual Studio Community, miễn phí cho cá nhân, sinh viên và dự án mã nguồn mở, nhưng không phải cho mọi công ty. Nếu bạn cài ở chỗ làm, hãy hỏi xem công ty dùng phiên bản nào. Chọn workload “Desktop development with C++” là có đủ mọi thứ Rust cần.
  • Windows và GNU. Toolchain MSVC là mặc định và hoạt động tốt nhất với các phần mềm Windows khác. Toolchain GNU không cần Visual Studio cho các chương trình đơn giản, nhưng nhiều crate có kèm code C sẽ không build được cho tới khi bạn cài thêm MSYS2 với MinGW. Phần lớn mọi người nên dùng MSVC.
  • WSL là lựa chọn tuyệt vời nếu bạn muốn có môi trường Linux trên Windows (ví dụ vì server của bạn chạy Linux). Bên trong WSL, bạn cài Rust bằng lệnh Linux thông thường, tách biệt với bản cài trên Windows.
  • Thêm cho Linux. Một số crate phổ biến làm việc với thư viện hệ thống. Nếu build lỗi với thông báo về pkg-config hoặc OpenSSL, trên Ubuntu hãy cài thêm pkg-config và libssl-dev.

Sau đó, hãy làm theo các bước cài đặt ở bài Bắt đầu với Rust.

Khi đã cài Rust, rustup là công cụ bạn dùng để chăm sóc nó. Cứ sáu tuần lại có một bản Rust stable mới, nên cập nhật là thói quen bình thường:

Terminal window
rustup update # cập nhật mọi toolchain đã cài (và cả rustup)
rustup show # đã cài những gì, và toolchain nào đang dùng ở đây

rustup show in ra đại loại như sau (đã rút gọn):

Default host: x86_64-unknown-linux-gnu
installed toolchains
--------------------
stable-x86_64-unknown-linux-gnu (active, default)
active toolchain
----------------
name: stable-x86_64-unknown-linux-gnu
active because: it's the default toolchain

Một toolchain là một bộ hoàn chỉnh gồm rustc, cargo và các công cụ đi kèm. Rust có ba kênh phát hành:

Kênh Là gì Dùng khi nào
stable Bản phát hành chính thức, sáu tuần một lần Gần như luôn luôn. Đây là thứ bạn cần
beta Bản stable tiếp theo, đang được thử nghiệm Bạn muốn kiểm tra dự án trước bản phát hành sắp tới
nightly Được build mỗi đêm, có các tính năng thử nghiệm Một công cụ hay crate yêu cầu nó, hoặc bạn muốn thử tính năng mới

Bạn có thể cài nhiều toolchain song song:

Terminal window
rustup toolchain install nightly # cài nightly bên cạnh stable
cargo +nightly build # dùng nightly cho riêng lệnh này
rustup default stable # chọn toolchain dùng ở mọi nơi

Đôi khi một dự án cần một phiên bản Rust cụ thể. Hãy đặt một file tên rust-toolchain.toml vào thư mục dự án, và rustup sẽ tự chuyển mỗi khi bạn làm việc trong thư mục đó:

[toolchain]
channel = "1.97.0"
components = ["clippy", "rustfmt"]
targets = ["wasm32-unknown-unknown"]

Hãy commit file này vào git. Khi đó mọi người trong nhóm (và cả CI) dùng đúng cùng một trình biên dịch, và rustup sẽ tự cài nó cho họ nếu còn thiếu. Phần lớn dự án nhỏ hoàn toàn không cần file này; chúng chỉ dùng bản stable mới nhất.

Component là những phần bổ sung của một toolchain. Target cho phép bạn biên dịch cho một loại máy khác:

Terminal window
rustup component add clippy rustfmt rust-src # rust-src: mã nguồn của std, rust-analyzer dùng nó
rustup component list --installed # xem bạn đang có gì
rustup target add wasm32-unknown-unknown # biên dịch Rust cho trình duyệt

Target wasm32-unknown-unknown là thứ bạn cần cho WebAssembly.

Bạn có thể viết Rust bằng bất kỳ trình soạn thảo văn bản nào, nhưng một editor có rust-analyzer (hoặc một engine tương tự) tạo ra khác biệt rất lớn. Bạn thấy lỗi ngay khi gõ, kiểu của các biến hiện ngay bên cạnh, và bạn có thể nhảy tới định nghĩa của bất kỳ hàm nào. Với người mới bắt đầu, những phản hồi đó giống như có một gia sư kiên nhẫn ngồi cạnh.

Editor Giá Hỗ trợ Rust Hợp với
VS Code + rust-analyzer Miễn phí Extension rust-analyzer chính thức (tiếng Anh) Phần lớn mọi người. Đây là lựa chọn phổ biến nhất, và hầu hết hướng dẫn đều mặc định bạn dùng nó
RustRover (JetBrains) Miễn phí cho mục đích phi thương mại (học tập, dự án sở thích, mã nguồn mở không lương). Công việc thương mại cần gói trả phí Có sẵn, với engine Rust riêng của JetBrains và debugger tích hợp Những ai thích một IDE đầy đủ, có sẵn mọi thứ
Zed Miễn phí, mã nguồn mở Có sẵn (dùng rust-analyzer, và CodeLLDB để debug) Một editor hiện đại, rất nhanh
Neovim / Helix Miễn phí, mã nguồn mở Qua rust-analyzer. Helix gần như dùng được ngay; Neovim cần cấu hình một chút Những ai mê làm việc trong terminal
Visual Studio Các bản trả phí, cộng bản Community miễn phí Không hỗ trợ Rust chính thức Không hợp với Rust. Bạn chỉ cần bộ C++ Build Tools của nó cho linker

Điều khoản giấy phép của RustRover có thể thay đổi, nên hãy xem trang RustRover (tiếng Anh) để biết quy định hiện tại trước khi dùng nó ở chỗ làm.

Với Neovim, Helix và các editor khác, hãy cài chương trình rust-analyzer bằng rustup component add rust-analyzer.

Nếu bạn dùng VS Code, bốn extension này gần như lo hết mọi thứ:

  • rust-analyzer (tiếng Anh) — thứ không thể thiếu: gợi ý code, báo lỗi, gợi ý kiểu, refactor.
  • CodeLLDB (tiếng Anh) — một debugger để đặt breakpoint và chạy từng bước qua code. Nó có kèm bản LLDB riêng.
  • Even Better TOML (tiếng Anh) — tô màu và kiểm tra Cargo.toml của bạn.
  • Error Lens (tiếng Anh, tùy chọn) — hiện thông báo lỗi ngay trên dòng code, không chỉ khi bạn rê chuột vào. Có người rất thích, có người thấy rối mắt.

Khi đã cài rust-analyzer và CodeLLDB trong VS Code, bạn sẽ thấy các liên kết nhỏ Run | Debug phía trên fn main và phía trên mỗi test. Bấm vào mép trái của số dòng để đặt một chấm đỏ breakpoint, rồi bấm Debug. Chương trình dừng lại ở breakpoint, và bạn có thể xem mọi biến và chạy code từng dòng một.

Nếu bạn muốn một cấu hình dùng lại được (ví dụ để truyền đối số dòng lệnh), hãy tạo .vscode/launch.json:

{
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug task_queue",
"cargo": {
"args": ["build", "--bin=task_queue"]
},
"args": [],
"cwd": "${workspaceFolder}"
}
]
}

Phần cargo bảo CodeLLDB build chương trình bằng cargo trước, rồi khởi chạy nó trong debugger. Hãy thay task_queue bằng tên package của bạn, và đặt các đối số của chương trình vào "args". Nhấn F5 để bắt đầu.

Không phải lúc nào bạn cũng cần cả một debugger. Macro dbg! in ra một biểu thức, giá trị của nó, cùng file và dòng nơi bạn viết nó. Nó còn trả lại giá trị, nên bạn có thể bọc nó quanh gần như mọi thứ mà không làm thay đổi hành vi của code:

fn apply_discount(price: u32, percent: u32) -> u32 {
price - price * percent / 100
}
fn main() {
let prices = [120, 45, 80];
let total: u32 = dbg!(prices.iter().sum());
let final_price = dbg!(apply_discount(total, 10));
println!("Tổng sau khi giảm 10%: {final_price}");
}

Kết quả:

Tổng sau khi giảm 10%: 221
▶ Tự chạy thử

Các dòng của dbg! đi đâu rồi? dbg! in ra stderr (luồng lỗi), chứ không phải stdout như println!. Nhờ vậy các ghi chú debug tách biệt với kết quả thật của bạn. Trong terminal, hoặc trong phần “Standard Error” của Playground, bạn sẽ thấy thêm:

[src/main.rs:8:22] prices.iter().sum() = 245
[src/main.rs:9:23] apply_discount(total, 10) = 221

Hãy xóa các lời gọi dbg! khi đã xong. Chúng là để cho bạn, không phải cho người dùng của bạn.

Ba lệnh giữ cho code của bạn khỏe mạnh. Chúng chạy nhanh, nên hãy chạy thường xuyên.

cargo check tìm lỗi biên dịch mà không build ra chương trình để chạy, nên nó nhanh hơn cargo build nhiều. Nhiều lập trình viên chạy nó vài phút một lần. (rust-analyzer trong editor của bạn chạy một bước kiểm tra như vậy mỗi lần bạn lưu file.)

cargo fmt: khỏi phải cãi nhau về phong cách

Phần tiêu đề “cargo fmt: khỏi phải cãi nhau về phong cách”

cargo fmt viết lại mọi file trong dự án theo phong cách Rust chuẩn. Không ai trong nhóm phải bận tâm về khoảng trắng hay xuống dòng nữa. Nó biến đoạn này:

struct Player{name:String,score:u32}
fn top(players:&[Player])->Option<&Player>{players.iter().max_by_key(|p|p.score)}

thành đoạn này:

struct Player {
name: String,
score: u32,
}
fn top(players: &[Player]) -> Option<&Player> {
players.iter().max_by_key(|p| p.score)
}

Phần lớn editor có thể chạy nó mỗi lần bạn lưu file. Trong VS Code, hãy bật cài đặt “Format On Save”.

cargo clippy: một buổi review code thân thiện

Phần tiêu đề “cargo clippy: một buổi review code thân thiện”

Clippy biết hàng trăm mẫu code sai, chậm, hoặc đơn giản là khó đọc hơn mức cần thiết. Đây là một chương trình nhỏ chạy hoàn toàn bình thường:

fn main() {
let tasks: Vec<&str> = vec!["viết tài liệu", "sửa lỗi"];
if tasks.len() == 0 {
println!("Không có việc gì cả!");
} else {
println!("{} việc đang chờ", tasks.len());
}
}

Nhưng cargo clippy có một gợi ý:

warning: length comparison to zero
--> src/main.rs:4:8
|
4 | if tasks.len() == 0 {
| ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `tasks.is_empty()`
|
= note: `#[warn(clippy::len_zero)]` on by default

Clippy báo rằng so sánh độ dài với 0 không rõ ràng bằng dùng is_empty. Mỗi cảnh báo có một cái tên (ở đây là len_zero) mà bạn có thể tra trong danh sách lint của Clippy (tiếng Anh) để đọc giải thích dài hơn. Đây là phiên bản đã sửa:

fn main() {
let tasks: Vec<&str> = vec!["viết tài liệu", "sửa lỗi"];
if tasks.is_empty() {
println!("Không có việc gì cả!");
} else {
println!("{} việc đang chờ", tasks.len());
}
}

Kết quả:

2 việc đang chờ
▶ Tự chạy thử

cargo clippy --fix có thể tự áp dụng nhiều gợi ý cho bạn. Clippy không phải lúc nào cũng đúng với hoàn cảnh của bạn, nhưng nó đúng đủ thường xuyên để việc đọc mọi cảnh báo trở thành cách nhanh để học viết Rust cho chuẩn.

Ai cũng có thể thêm lệnh con mới cho cargo. Bạn cài chúng bằng cargo install, lệnh này tải mã nguồn về, biên dịch, rồi đặt chương trình vào ~/.cargo/bin (trên Windows là %USERPROFILE%\.cargo\bin). Ngày đầu tiên bạn chưa cần cái nào trong số này, nhưng nên biết chúng:

Công cụ Tác dụng Cài đặt Chạy
bacon Chạy lại check, clippy hoặc test mỗi lần bạn lưu, trong một terminal bên cạnh cargo install --locked bacon bacon, bacon clippy, bacon test
cargo-watch Chạy bất kỳ lệnh cargo nào khi lưu file. Vẫn dùng được nhưng không còn được cập nhật; tác giả của nó khuyên dùng bacon cargo install --locked cargo-watch cargo watch -x check
cargo-nextest Trình chạy test nhanh hơn, kết quả dễ đọc hơn cargo install --locked cargo-nextest cargo nextest run
cargo-audit Đối chiếu Cargo.lock của bạn với các cảnh báo bảo mật đã biết cargo install cargo-audit cargo audit
cargo-outdated Liệt kê các thư viện phụ thuộc đã có phiên bản mới hơn cargo install --locked cargo-outdated cargo outdated
cargo-edit Thêm lệnh cargo upgrade để nâng phiên bản trong Cargo.toml (cargo add thì đã có sẵn) cargo install cargo-edit cargo upgrade
cargo-expand Cho xem code mà các macro và #[derive] của bạn sinh ra cargo install cargo-expand cargo expand
cargo-binstall Tải binary dựng sẵn thay vì biên dịch, nên cài chỉ mất vài giây cargo install cargo-binstall cargo binstall bacon

Các liên kết trong bảng đều là trang tiếng Anh. cargo install biên dịch từ mã nguồn, nên lần cài đầu tiên của một công cụ lớn có thể mất vài phút. Điều đó là bình thường. Để cập nhật công cụ về sau, chạy lại đúng lệnh cài đặt đó. Để xem bạn đã cài những gì, chạy cargo install --list. Với các công cụ tập trung vào tốc độ như profiler và benchmark, xem bài Hiệu năng.

Rust Playground chạy Rust ngay trong trình duyệt của bạn. Mọi nút “Tự chạy thử” trên trang này đều mở nó. Nó rất hợp để thử nghiệm nhanh, chia sẻ một đoạn code khi bạn cần hỏi, hoặc học trên một máy tính không cho cài đặt gì.

Những gì nó làm được:

  • Chạy code của bạn trên stable, beta hoặc nightly, ở dạng build debug hoặc release.
  • Dùng 100 crate được tải nhiều nhất trên crates.io (cộng với các crate mà Rust Cookbook dùng, và các thư viện phụ thuộc của chúng), như serde, rand, regex và tokio.
  • Chạy rustfmt và Clippy từ menu Tools.
  • Chia sẻ code của bạn dưới dạng một đường link.

Những gì nó không làm được:

  • Có nhiều hơn một file. Không có Cargo.toml, nên bạn không chọn được crate hay phiên bản khác.
  • Truy cập mạng. Code tải một trang web sẽ thất bại.
  • Làm việc với file của riêng bạn, hoặc chạy trong thời gian dài. Thời gian và bộ nhớ đều có giới hạn.
  • Thoải mái với chương trình tương tác. Khi chương trình chạy, có một ô nhỏ cho bạn nhập dữ liệu, nhưng ngoài việc thử nhanh ra thì khá bất tiện. Các ví dụ trên trang này không bao giờ đọc dữ liệu nhập vào, nên chúng chạy được chỉ với một cú bấm.

Khi Playground không còn đủ dùng, một dự án trên máy với cargo new chỉ cách bạn một phút.

Bạn đang cài đặt một máy tính mới? Hãy đi qua danh sách này một lần:

  • Cài các thứ hệ điều hành cần: bộ công cụ C++ của Visual Studio (Windows), xcode-select --install (macOS), hoặc build-essential / gcc (Linux).
  • Cài Rust từ rustup.rs (tiếng Anh), rồi mở một terminal mới.
  • Kiểm tra: rustc --version và cargo --version.
  • Đảm bảo có đủ các công cụ dùng hằng ngày: rustup component add clippy rustfmt.
  • Cài một editor có rust-analyzer. Với VS Code, thêm các extension rust-analyzer và CodeLLDB.
  • Bật định dạng khi lưu (format on save) trong editor.
  • Tạo một dự án thử bằng cargo new hello rồi chạy cargo run, cargo clippy và cargo fmt trong đó.
  • Đặt lời nhắc chạy rustup update mỗi một hai tháng.
  • Tùy chọn: cargo install --locked bacon để có phản hồi tức thì khi viết code.

Trên máy của bạn, chạy từng lệnh sau và đảm bảo không lệnh nào báo “not installed”: rustup show, cargo clippy --version, cargo fmt --version. Sau đó mở tài liệu thư viện chuẩn ngoại tuyến và tìm trang của Vec. Gợi ý: rustup doc nhận vào một chủ đề, chẳng hạn đường dẫn đầy đủ của một kiểu.

Xem lời giải
Terminal window
rustup show
cargo clippy --version
cargo fmt --version
rustup doc std::vec::Vec

Mỗi lệnh --version in ra một số phiên bản. Nếu lệnh nào in ra lỗi, hãy cài phần còn thiếu bằng rustup component add clippy hoặc rustup component add rustfmt. Lệnh cuối cùng mở trang Vec trong trình duyệt, lấy thẳng từ ổ đĩa của bạn. Nếu nó báo chưa cài rust-docs, hãy chạy rustup component add rust-docs trước.

Trong một dự án mới, dán phiên bản đầu tiên của chương trình quản lý việc ở phần Clippy vào src/main.rs. Chạy cargo clippy, đọc cảnh báo, rồi để Clippy tự sửa giúp bạn. Gợi ý: có một cờ (flag) giúp tự động áp dụng các gợi ý.

Xem lời giải
Terminal window
cargo new task_queue
cd task_queue
# dán chương trình vào src/main.rs, rồi:
cargo clippy
cargo clippy --fix --allow-dirty
cargo clippy

Lần cargo clippy đầu tiên hiện cảnh báo len_zero. cargo clippy --fix viết lại tasks.len() == 0 thành tasks.is_empty(). Cờ --allow-dirty cho phép nó sửa những file bạn chưa commit vào git. Lần chạy cuối không in ra cảnh báo nào.

  • rustup cài, cập nhật Rust và chuyển đổi toolchain; cargo build, chạy, test và thêm crate; rustc là trình biên dịch nằm bên dưới.
  • Mỗi hệ điều hành cần có linker trước: bộ công cụ C++ của Visual Studio trên Windows, xcode-select --install trên macOS, build-essential hoặc gcc trên Linux.
  • Hãy dùng stable. Chỉ dùng rust-toolchain.toml khi dự án bắt buộc cố định phiên bản, và cargo +nightly cho những lệnh nightly dùng một lần.
  • Dùng editor có rust-analyzer. VS Code với rust-analyzer và CodeLLDB là cấu hình phổ biến nhất.
  • Chạy cargo check thường xuyên, và cargo fmt cùng cargo clippy trước mỗi lần commit. Dùng dbg! để xem nhanh và debugger cho những lỗi khó hơn.
  • Playground rất tuyệt để thử nghiệm và chia sẻ, nhưng chỉ có một file, không có mạng, và chỉ có những crate phổ biến nhất.

Kiểm tra nhanh

1. Bạn sẽ dùng công cụ nào để cài toolchain nightly bên cạnh stable?

2. Build trên Windows thất bại vì không tìm thấy linker. Nhiều khả năng đang thiếu gì?

3. dbg! in kết quả ra đâu?

4. Rust Playground KHÔNG làm được việc nào sau đây?

Điểm: 0 / 4

  • Install Rust — rust-lang.org (tiếng Anh): trình cài đặt chính thức cho mọi nền tảng, cùng ghi chú về Windows, PATH và cách gỡ cài đặt.
  • The rustup book (tiếng Anh): toolchain, kênh phát hành, component, profile, rust-toolchain.toml và các target biên dịch chéo.
  • The Cargo Book (tiếng Anh): mọi thứ về cargo, kể cả cargo install và các tùy chọn của từng lệnh.
  • rust-analyzer manual (tiếng Anh): thiết lập rust-analyzer trong VS Code, Neovim, Helix, Emacs và nhiều editor khác, cùng mọi cài đặt của nó.
  • Clippy documentation (tiếng Anh): cách chạy và cấu hình Clippy, kèm liên kết tới danh sách đầy đủ các lint và ý nghĩa của từng cái.