Rust Crate and Package

A crate can contain one or more Rust modules, which in turn can contain code, such as functions, types, and constants.

A crate is of two types:

  • Binary crate
  • Library crate

A binary crate is a Rust program that compiles to an executable or multiple executables and has a main() function for each executable.

A library crate doesn't compile to an executable and doesn't have a main() function. A library crate generally defines a shared functionality that can be used in multiple projects.

Crates can be bundled together into a package.


Creating a Package in Rust

Packages can be created using the Cargo package manager, which is built into Rust. Cargo comes pre-installed with Rust.

We can use cargo to create a package. A package contains one or more crates that provides a set of functionality.

Note: A package can contain many binary crates, but at most only one library crate.


Creating a Binary Package in Rust

To create a binary package, we can use the cargo command in the terminal.

$ cargo new hello_world --bin

Output

Created binary (application) `hello_world` package

We create a binary package hello_world using cargo and the --bin option. It is the default cargo behavior.

Let's look at the contents of the hello_world package.

hello_world
├── Cargo.toml
└── src
    └── main.rs

Here,

  • hello_world is the package directory
  • Cargo.toml is a file that contains metadata about the crate, such as its name, version, and dependencies
  • src/main.rs is the crate root and contains the source code of the binary package

Creating a Library Package in Rust

Similarly, we can create a library package in Rust using cargo.

$ cargo new hello_world_lib --lib

Output

Created library `hello_world_lib` package

We create a library package hello_world_lib using cargo and the --lib option.

Let's look at the contents of the hello_world_lib package.

hello_world_lib
├── Cargo.toml
└── src
    └── lib.rs

Here,

  • hello_world_lib is the package directory
  • Cargo.toml is a file that contains metadata about the crate, such as its name, version, and dependencies
  • src/lib.rs is the crate root and contains the source code of the library package

A package can contain src/main.rs and src/lib.rs. In this case, it has two crates: a binary and a library, both with the same name as the package. For example,

hello_world
├── Cargo.toml
└── src
    └── lib.rs
    └── main.rs

Note: Cargo by convention passes the crate root files to the Rust compiler to build the library or binary.

Your builder path starts here. Builders don't just know how to code, they create solutions that matter.

Escape tutorial hell and ship real projects.

Try Programiz PRO
  • Real-World Projects
  • On-Demand Learning
  • AI Mentor
  • Builder Community