# Crates, Cargo.toml and Modules — Rust

Source: https://www.skillbyai.com/en/rust/i-crates

> Packages and code organisation.

## Crates, editions and modules

A **crate** is a compilation unit: a binary (with `main.rs`) or a library (`lib.rs`). `Cargo.toml` names the package, sets the **edition** (2015, 2018, 2021, 2024: opt-in language updates that keep old code compiling), and lists dependencies from crates.io with version requirements; `Cargo.lock` records exact versions. Code is organised into **modules** (`mod orders;` maps to `orders.rs` or `orders/mod.rs`); items are private by default and exported with `pub`.

## A Cargo.toml with dependencies

Typical manifest; versions are examples.

```toml
[package]
name = "shop"
version = "0.1.0"
edition = "2024"

[dependencies]
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["full"] }

[dev-dependencies]
pretty_assertions = "1"
```

## Commit Cargo.lock for applications

For binaries, committing Cargo.lock makes builds reproducible; libraries usually leave it to their users.

**Quiz:** How do you make a function visible outside its module?

- [ ] Use the export keyword
- [ ] Name it with a capital letter
- [ ] Put it in Cargo.toml
- [x] Mark it pub

*Answer:* Mark it pub. Private by default.
