#path #executable #metadata

build cargo_metadata

structured access to the output of cargo metadata

59 releases

0.19.2 Mar 2, 2025
0.19.1 Dec 3, 2024
0.19.0 Nov 20, 2024
0.18.1 Oct 13, 2023
0.2.0 Mar 17, 2017

#1 in Cargo plugins

Download history 829099/week @ 2024-12-06 781672/week @ 2024-12-13 489895/week @ 2024-12-20 519086/week @ 2024-12-27 753459/week @ 2025-01-03 899462/week @ 2025-01-10 828205/week @ 2025-01-17 809870/week @ 2025-01-24 835032/week @ 2025-01-31 936888/week @ 2025-02-07 906542/week @ 2025-02-14 1028024/week @ 2025-02-21 1031268/week @ 2025-02-28 1062854/week @ 2025-03-07 1104918/week @ 2025-03-14 854790/week @ 2025-03-21

4,238,403 downloads per month
Used in 2,693 crates (638 directly)

MIT license

73KB
1K SLoC

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


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

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

use cargo_metadata::{MetadataCommand, CargoOpt};

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

Parse message-format output:

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

~0.9–1.9MB
~38K SLoC