Skip to content

Instantly share code, notes, and snippets.

@sinkuu
Last active September 3, 2020 13:21
Show Gist options
  • Save sinkuu/8083240257c485c9f928744b41bbac98 to your computer and use it in GitHub Desktop.
Save sinkuu/8083240257c485c9f928744b41bbac98 to your computer and use it in GitHub Desktop.
cargo-unused-deps
use cargo_metadata::{CargoOpt, DependencyKind, MetadataCommand};
use std::process::Command;
fn main() {
let mut packages = MetadataCommand::new()
.manifest_path("./Cargo.toml")
.features(CargoOpt::AllFeatures)
.exec()
.unwrap()
.packages;
packages.sort_by_key(|p| p.source.is_some());
for package in packages {
let src_paths = package
.targets
.iter()
.filter(|t| t.src_path.exists())
.map(|t| t.src_path.with_file_name("").into_os_string())
.collect::<Vec<_>>();
let is_dep = package.source.is_some();
for dep in package
.dependencies
.into_iter()
.filter(|d| !is_dep || d.kind != DependencyKind::Development)
.map(|d| d.rename.unwrap_or(d.name))
{
let found = Command::new("rg")
.args(&["--type", "rust"])
.arg("-qw")
.arg(dep.replace("-", "_"))
.args(&src_paths)
.status()
.unwrap()
.success();
if !found {
println!(
"{} ({}): {} not found",
package.name,
package.manifest_path.display(),
dep
);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment