Packages and Crates
Crates
A crate is Rust’s compilation unit—the smallest code unit the compiler processes. Crates come in two forms:
- Binary crates: Executables with a
mainfunction (like Node.js applications) - Library crates: Reusable code without
main(like npm packages)
The crate root is the source file where compilation begins, forming the root module of the crate’s module tree.
Packages
A package contains one or more crates plus a Cargo.toml manifest. Think of it as similar to a Node.js project with package.json.
Package rules:
- Must contain at least one crate
- Can contain at most one library crate
- Can contain unlimited binary crates
Cargo Conventions
$ cargo new my-project
Created binary (application) `my-project` package
Cargo follows these conventions:
src/main.rs→ binary crate root (package name)src/lib.rs→ library crate root (package name)src/bin/→ additional binary crates (one per file)
A package with both src/main.rs and src/lib.rs contains two crates: a binary and library, both named after the package. This pattern is common for CLI tools that expose both an executable and library API.