44 releases

new 0.12.3 Jan 15, 2021
0.12.1 Nov 22, 2020
0.11.1 Jul 28, 2020
0.9.1 Nov 30, 2019
0.2.0 Mar 17, 2017

#18 in Build Utils

Download history 44772/week @ 2020-09-28 46666/week @ 2020-10-05 44863/week @ 2020-10-12 42815/week @ 2020-10-19 46468/week @ 2020-10-26 43603/week @ 2020-11-02 43139/week @ 2020-11-09 45392/week @ 2020-11-16 44860/week @ 2020-11-23 48136/week @ 2020-11-30 49942/week @ 2020-12-07 49626/week @ 2020-12-14 43264/week @ 2020-12-21 45679/week @ 2020-12-28 60355/week @ 2021-01-04 62152/week @ 2021-01-11

205,896 downloads per month
Used in 465 crates (143 directly)

MIT license

40KB
606 lines

cargo_metadata

Structured access to the output of cargo metadata. Usually used from within a cargo-* executable.

Also supports serialization to aid in implementing --message-format=json-like output generation in cargo-* subcommands, since some of the types in what cargo --message-format=json emits are exactly the same as the ones from cargo metadata.

Build Status crates.io

Documentation - contains examples of use with std::env::args, docopt, clap, and structopt.


lib.rs:

Structured access to the output of cargo metadata and cargo --message-format=json. Usually used from within a cargo-* executable

See the cargo book for details on cargo itself.

Examples

# extern crate cargo_metadata;
# use std::path::Path;
let mut args = std::env::args().skip_while(|val| !val.starts_with("--manifest-path"));

let mut cmd = cargo_metadata::MetadataCommand::new();
let manifest_path = match args.next() {
    Some(ref p) if p == "--manifest-path" => {
        cmd.manifest_path(args.next().unwrap());
    }
    Some(p) => {
        cmd.manifest_path(p.trim_start_matches("--manifest-path="));
    }
    None => {}
};

let _metadata = cmd.exec().unwrap();

Pass features flags

# // This should be kept in sync with the equivalent example in the readme.
# extern crate cargo_metadata;
# use std::path::Path;
# fn main() {
use cargo_metadata::{MetadataCommand, CargoOpt};

let _metadata = MetadataCommand::new()
    .manifest_path("./Cargo.toml")
    .features(CargoOpt::AllFeatures)
    .exec()
    .unwrap();
# }

Parse message-format output:

# extern crate cargo_metadata;
use std::process::{Stdio, Command};
use cargo_metadata::Message;

let mut command = Command::new("cargo")
    .args(&["build", "--message-format=json-render-diagnostics"])
    .stdout(Stdio::piped())
    .spawn()
    .unwrap();

let reader = std::io::BufReader::new(command.stdout.take().unwrap());
for message in cargo_metadata::Message::parse_stream(reader) {
    match message.unwrap() {
        Message::CompilerMessage(msg) => {
            println!("{:?}", msg);
        },
        Message::CompilerArtifact(artifact) => {
            println!("{:?}", artifact);
        },
        Message::BuildScriptExecuted(script) => {
            println!("{:?}", script);
        },
        Message::BuildFinished(finished) => {
            println!("{:?}", finished);
        },
        _ => () // Unknown message
    }
}

let output = command.wait().expect("Couldn't get cargo's exit status");

Dependencies

~1.9–2.6MB
~58K SLoC