| created | "2025-12-16T00:00:00.000Z" |
| modified | "2025-12-16T00:00:00.000Z" |
| reviewed | "2025-12-16T00:00:00.000Z" |
| name | cargo-machete |
| description | Detect unused dependencies in Rust projects for cleaner Cargo.toml files and faster builds.
Use when auditing dependencies, optimizing build times, cleaning up Cargo.toml, or detecting bloat.
Trigger terms: unused dependencies, cargo-machete, dependency audit, dependency cleanup, bloat detection, cargo-udeps.
|
cargo-machete - Unused Dependency Detection
cargo-machete is a fast tool for detecting unused dependencies in Rust projects. It analyzes your codebase to find dependencies listed in Cargo.toml but not actually used in your code.
Installation
cargo install cargo-machete
cargo machete --version
Basic Usage
cargo machete
cargo machete /path/to/project
cargo machete --with-metadata
cargo machete --fix
cargo machete --workspace
Output Examples
Basic Output
$ cargo machete
Found unused dependencies in Cargo.toml:
serde_json (unused)
log (unused in lib, used in build.rs)
tokio (unused features: macros)
With Metadata
$ cargo machete --with-metadata
Project: my_app (bin)
Unused dependencies:
- serde_json (0.1.0)
Declared in: Cargo.toml [dependencies]
Not used in: src/main.rs
Partially used:
- tokio (1.35.0)
Unused features: macros, fs
Used features: runtime, net
False Positive Handling
Common False Positives
-
Dependencies used only in build.rs:
[build-dependencies]
bindgen = "0.69"
-
Dependencies used only in examples:
[dev-dependencies]
criterion = "0.5"
-
Dependencies used via re-exports:
pub use external_crate::SomeType; # Machete may not detect
-
Proc-macro dependencies:
[dependencies]
serde = { version = "1.0", features = ["derive"] }
Ignoring False Positives
Create .cargo-machete.toml or add to Cargo.toml:
[ignore]
dependencies = ["serde", "log"]
[ignore.my_crate]
dependencies = ["tokio"]
Or use inline comments in Cargo.toml:
[dependencies]
serde = "1.0"
log = "0.4"
Comparison with cargo-udeps
| Feature | cargo-machete | cargo-udeps |
|---|
| Accuracy | Good | Excellent |
| Speed | Very fast | Slower |
| Rust version | Stable | Requires nightly |
| False positives | Some | Fewer |
| Installation | Simple | Requires nightly setup |
| Maintenance | Active | Active |
When to Use Each
Use cargo-machete when:
- Working with stable Rust
- Need fast feedback in CI
- Willing to verify results manually
- Want simple installation
Use cargo-udeps when:
- Accuracy is critical
- Can use nightly toolchain
- Need to catch all unused dependencies
- Have time for slower analysis
Using Both Together
cargo machete
cargo +nightly udeps
cargo-udeps Installation and Usage
For comparison, here's how to use the more accurate cargo-udeps:
rustup toolchain install nightly
cargo +nightly install cargo-udeps
cargo +nightly udeps
cargo +nightly udeps --all-features
cargo +nightly udeps --workspace
CI Integration
GitHub Actions with cargo-machete
name: Dependency Check
on: [push, pull_request]
jobs:
unused-deps:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Install cargo-machete
uses: taiki-e/install-action@v2
with:
tool: cargo-machete
- name: Check for unused dependencies
run: cargo machete --with-metadata
GitHub Actions with cargo-udeps (Nightly)
name: Dependency Check
on: [push, pull_request]
jobs:
unused-deps:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- uses: Swatinem/rust-cache@v2
- name: Install cargo-udeps
uses: taiki-e/install-action@v2
with:
tool: cargo-udeps
- name: Check for unused dependencies
run: cargo +nightly udeps --workspace --all-features
GitHub Action (Official cargo-machete Action)
name: Dependency Check
on: [push, pull_request]
jobs:
unused-deps:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check unused dependencies
uses: bnjbvr/cargo-machete@main
Advanced Usage
Workspace Configuration
cargo machete --workspace
cargo machete -p crate1 -p crate2
cargo machete --workspace --exclude integration_tests
Custom Configuration File
Create .cargo-machete.toml in project root:
[ignore]
dependencies = [
"serde",
"log",
]
[ignore.my_lib]
dependencies = ["lazy_static"]
[ignore.my_bin]
dependencies = ["clap"]
[workspace]
exclude = ["internal_tools", "examples"]
Integration with Pre-commit
repos:
- repo: local
hooks:
- id: cargo-machete
name: Check for unused dependencies
entry: cargo machete
language: system
pass_filenames: false
files: Cargo.toml$
Workflow Integration
Combined with Other Tools
cargo machete
cargo outdated
cargo audit
cargo deny check licenses
Makefile Integration
.PHONY: deps-check deps-clean
deps-check:
@echo "Checking for unused dependencies..."
@cargo machete --with-metadata
deps-clean:
@echo "Removing unused dependencies..."
@cargo machete --fix
@echo "Running cargo check..."
@cargo check --all-targets
Script for CI
#!/usr/bin/env bash
set -euo pipefail
echo "Running cargo-machete..."
if ! cargo machete --with-metadata; then
echo "❌ Unused dependencies detected!"
echo "Run 'cargo machete --fix' to remove them."
exit 1
fi
echo "✅ No unused dependencies found."
Best Practices
-
Run regularly in CI:
- run: cargo machete --with-metadata
-
Document false positives:
[dependencies]
serde = "1.0"
-
Use with workspace:
cargo machete --workspace --with-metadata
-
Verify before using --fix:
cargo machete --with-metadata
cargo machete --fix
cargo check --all-targets
-
Combine with cargo-udeps for accuracy:
cargo machete
cargo +nightly udeps -p critical_lib
-
Add to pre-commit hooks for early detection:
- id: cargo-machete
entry: cargo machete
language: system
-
Keep configuration file for complex projects:
[ignore]
dependencies = ["known-false-positives"]
Troubleshooting
False positives for proc macros:
[ignore]
dependencies = ["serde", "tokio-macros"]
Build.rs dependencies flagged:
[build-dependencies]
cc = "1.0"
Re-exported dependencies flagged:
[dependencies]
external = "1.0"
Workspace member issues:
cargo machete -p problematic_crate --with-metadata
Need more accuracy:
cargo +nightly udeps --workspace
References