Cargo, Crates and Basic Project Structure


Cargo is Rust’s built-in package manager and the build system. It can be used to,

  • Create a new project: cargo new
  • Build the project: cargo build
  • Run the project: cargo run
  • Update project dependencies: cargo update
  • Run tests: cargo test
  • Generate the project documentation via rustdoc: cargo doc
  • Analyze the project to see it has any errors, without building it: cargo check

In addition, there are cargo commands to publish the project as a crate/ package to Rust’s official crate registry,

πŸ’‘ We need to get an API token from to publish a crate to it. The API token can be found in the Account Settings page, after login to that site. We will discuss more about this under code organization with crates.

  • Log in to with the API token: cargo login
  • Make the local crate uploadable to cargo package
  • Upload the crate to cargo publish


A crate is a package, which can be shared via A crate can produce an executable or a library. In other words, it can be a binary crate or a library crate.

  1. cargo new crate_name --bin or cargo new crate_name: Produces an executable
  2. cargo new crate_name --lib: Produces a library

The first one generates,

β”œβ”€β”€ Cargo.toml
└── src

and the second one generates,

β”œβ”€β”€ Cargo.toml
└── src
  • Cargo.toml(capital c) is the configuration file which contains all of the metadata that Cargo needs to compile your project.
  • src folder is the place to store the source code.
  • Each crate has an implicit crate root/ entry point. is the crate root for a binary crate and is the crate root for a library crate.

πŸ’‘ When we build a binary crate via cargo build or cargo run, the executable file will be stored in target/debug/ folder. But when building it via cargo build --release for a release it will be stored in target/release/ folder.

Project Structure

This is how Cargo Docs describes about the recommended project layout,

β”œβ”€β”€ Cargo.lock
β”œβ”€β”€ Cargo.toml
β”œβ”€β”€ benches
β”‚   └──
β”œβ”€β”€ examples
β”‚   └──
β”œβ”€β”€ src
β”‚   β”œβ”€β”€ bin
β”‚   β”‚   └──
β”‚   β”œβ”€β”€
β”‚   └──
└── tests
  • The source code goes in the src directory.
  • The default library file is src/
  • The default executable file is src/
  • Other executables can be placed in src/bin/*.rs.
  • Integration tests go in the tests directory (unit tests go in each file they’re testing).
  • Examples go in the examples directory.
  • Benchmarks go in the benches directory.