cargo-shear

Crates.iocargo-shear
lib.rscargo-shear
version1.5.2
created_at2024-03-15 09:33:30.855157+00
updated_at2025-09-22 13:33:22.607423+00
descriptionDetect and remove unused dependencies from Cargo.toml
homepage
repositoryhttps://github.com/Boshen/cargo-shear
max_upload_size
id1174532
size141,295
Boshen (Boshen)

documentation

README

Cargo Shear ✂️ 🐑

Detect and remove unused dependencies from Cargo.toml in Rust projects.

Installation

# Install from pre-built binaries.
cargo binstall cargo-shear

# Build from source.
cargo install cargo-shear

# Install from brew.
brew install cargo-shear

Usage

cargo shear --fix

Limitation

[!IMPORTANT] cargo shear cannot detect "hidden" imports from macro expansions without the --expand flag (nightly only). This is because cargo shear uses syn to parse files and does not expand macros by default.

To expand macros:

cargo shear --expand --fix

The --expand flag uses cargo expand, which requires nightly and is significantly slower.

Ignore false positives

False positives can be ignored by adding them to the package's Cargo.toml:

[package.metadata.cargo-shear]
ignored = ["crate-name"]

or in the workspace Cargo.toml:

[workspace.metadata.cargo-shear]
ignored = ["crate-name"]

Otherwise please report the issue as a bug.

CI

- name: Install cargo-binstall
  uses: cargo-bins/cargo-binstall@main

- name: Install cargo-shear
  run: cargo binstall --no-confirm cargo-shear

- run: cargo shear

Exit Code (for CI)

The exit code gives an indication whether unused dependencies have been found:

  • 0 if found no unused dependencies,
  • 1 if it found at least one unused dependency,
  • 2 if there was an error during processing (in which case there's no indication whether any unused dependency was found or not).

With --fix:

  • 0 if found no unused dependencies so no fixes were performed,
  • 1 if removed some unused dependencies. Useful for running cargo check after cargo-shear changed Cargo.toml.

GitHub Actions Job Example:

- name: cargo-shear
  shell: bash
  run: |
    if ! cargo shear --fix; then
      cargo check
    fi

Technique

  1. use the cargo_metadata crate to list all dependencies specified in [workspace.dependencies] and [dependencies]
  2. iterate through all package targets (lib, bin, example, test and bench) to locate all Rust files
  3. use syn to parse these Rust files and extract imports
  • alternatively, use the --expand option with cargo expand to first expand macros and then parse the expanded code (though this is significantly slower).
  1. find the difference between the imports and the package dependencies

Prior Arts

Trophy Cases

Sponsored By

My sponsors

Commit count: 364

cargo fmt