Detect and remove unused dependencies from Cargo.toml
in Rust projects.
cargo binstall cargo-shear
# OR
cargo install cargo-shear
cargo shear --fix
Important
cargo shear
cannot detect "hidden" imports from macro expansions.
This is because cargo shear
uses syn
to parse files and does not expand macros.
False positives can be ignored by adding them to the package's Cargo.toml
:
[package.metadata.cargo-shear]
ignored = ["crate"]
or in workspace's Cargo.toml
:
[workspace.metadata.cargo-shear]
ignored = ["crate"]
Otherwise please report the issue as a bug.
- name: Install cargo-binstall
uses: cargo-bins/cargo-binstall@main
- name: Install cargo-shear
run: cargo binstall --no-confirm cargo-shear
- run: cargo shear
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).
- use the
cargo_metadata
crate to list all dependencies specified in[workspace.dependencies]
and[dependencies]
- iterate through all package targets (
lib
,bin
,example
,test
andbench
) to locate all Rust files - use
syn
to parse these Rust files and extract imports - find the difference between the imports and the package dependencies
- est31/cargo-udeps
- it collects dependency usage by compiling your project and find them from the
target/
directory - does not seem to work anymore with the latest versions of
cargo
- does not work with cargo workspaces
- it collects dependency usage by compiling your project and find them from the
- bnjbvr/cargo-machete
- it collects dependency usage by running regex patterns on source code
- does not detect all usages of a dependency
- does not remove unused dependencies from the workspace root
- cargo and clippy
- There was intention to add similar features to cargo or clippy, but the progress is currently stagnant
- See rust-lang/rust#57274 and rust-lang/rust-clippy#4341