use krates::{Builder, Cmd, Krates, cm, petgraph};
fn main() -> Result<(), krates::Error> {
let mut cmd = Cmd::new();
cmd.manifest_path("path/to/a/Cargo.toml");
// Enable all features, works for either an entire workspace or a single crate
cmd.all_features();
let mut builder = Builder::new();
// Let's filter out any crates that aren't used by x86_64 windows
builder.include_targets(std::iter::once(("x86_64-pc-windows-msvc", vec![])));
let krates: Krates = builder.build(cmd, |pkg: cm::Package| {
println!("Crate {} was filtered out", pkg.id);
})?;
// Print a dot graph of the entire crate graph
println!("{:?}", petgraph::dot::Dot::new(krates.graph()));
Ok(())
}
krates
can also be used if you use cargo
as a dependency. It doesn't depend on cargo
itself since cargo moves quickly and we don't want to artificially limit which versions you use, but, at least with the current stable cargo
crate, the following code works well.
fn get_metadata(
no_default_features: bool,
all_features: bool,
features: Vec<String>,
manifest_path: PathBuf,
) -> Result<krates::cm::Metadata, anyhow::Error> {
let config = cargo::util::Config::default()?;
let ws = cargo::core::Workspace::new(&manifest_path, &config)?;
let options = cargo::ops::OutputMetadataOptions {
features,
no_default_features,
all_features,
no_deps: false,
version: 1,
filter_platforms: vec![],
};
let md = cargo::ops::output_metadata(&ws, &options)?;
let md_value = serde_json::to_value(md)?;
Ok(serde_json::from_value(md_value)?)
}
We welcome community contributions to this project.
Please read our Contributor Guide for more information on how to get started.
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.