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 directoryCargo.toml
is a file that contains metadata about the crate, such as its name, version, and dependenciessrc/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 directoryCargo.toml
is a file that contains metadata about the crate, such as its name, version, and dependenciessrc/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.