Cargo Workspaces

Workspaces manage multiple related crates with shared dependencies and a unified build system.

Creating a Workspace

Create workspace structure:

$ mkdir add
$ cd add

Workspace Cargo.toml:

[workspace]
resolver = "3"

Add binary crate:

$ cargo new adder
     Created binary (application) `adder` package
      Adding `adder` as member of workspace at `file:///projects/add`

Workspace structure:

├── Cargo.lock
├── Cargo.toml
├── adder
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── target

Key points:

  • Single target directory for all workspace members
  • Shared Cargo.lock ensures consistent dependency versions
  • Build from workspace root with cargo build

Adding Library Crates

$ cargo new add_one --lib
     Created library `add_one` package

Library implementation:

// add_one/src/lib.rs
pub fn add_one(x: i32) -> i32 {
    x + 1
}

Workspace dependencies:

# adder/Cargo.toml
[dependencies]
add_one = { path = "../add_one" }

Using workspace dependencies:

fn main() {
    let num = 10;
    println!("Hello, world! {num} plus one is {}!", add_one::add_one(num));
}

Workspace Commands

Build workspace:

$ cargo build
   Compiling add_one v0.1.0 (file:///projects/add/add_one)
   Compiling adder v0.1.0 (file:///projects/add/adder)

Run specific package:

$ cargo run -p adder
     Running `target/debug/adder`
Hello, world! 10 plus one is 11!

Test specific package:

$ cargo test -p add_one

External Dependencies

Dependencies must be explicitly added to each crate’s Cargo.toml:

# add_one/Cargo.toml
[dependencies]
rand = "0.8.5"

Workspace ensures all crates use the same version of shared dependencies.

Testing

Run all tests:

$ cargo test

Run specific crate tests:

$ cargo test -p add_one

Publishing

Each workspace member publishes independently:

$ cargo publish -p add_one
$ cargo publish -p adder

Benefits

  • Shared dependencies: Consistent versions across all crates
  • Unified build: Single command builds entire workspace
  • Cross-crate development: Easy local dependencies between related crates
  • Testing: Run tests across all crates simultaneously
  • Code sharing: Common utilities accessible to all workspace members

Workspaces are ideal for:

  • Multi-crate applications with shared libraries
  • Plugin architectures
  • Related tools that share common functionality