56个版本

0.18.1 2023年10月13日
0.17.0 2023年7月24日
0.15.3 2023年1月31日
0.15.2 2022年11月21日
0.2.0 2017年3月17日

#1 in Cargo插件

Download history 569117/week @ 2024-05-01 593511/week @ 2024-05-08 581509/week @ 2024-05-15 529992/week @ 2024-05-22 555050/week @ 2024-05-29 542125/week @ 2024-06-05 600941/week @ 2024-06-12 557119/week @ 2024-06-19 551968/week @ 2024-06-26 550280/week @ 2024-07-03 600521/week @ 2024-07-10 612364/week @ 2024-07-17 602659/week @ 2024-07-24 611575/week @ 2024-07-31 650682/week @ 2024-08-07 615881/week @ 2024-08-14

2,595,066 每月下载量
2,229 个crate中使用 (558个直接使用)

MIT 许可证

65KB
983

cargo_metadata

cargo metadata 输出的结构化访问。通常用于 cargo-* 可执行文件中。

还支持序列化,以帮助在 cargo-* 子命令中实现类似 --message-format=json 的输出生成,因为 cargo --message-format=json 输出的某些类型与 cargo metadata 的类型完全相同。

Build Status crates.io

文档


lib.rs:

cargo metadatacargo --message-format=json 的结构化访问。通常用于 cargo-* 可执行文件中。

有关 cargo 的详细信息,请参阅 cargo 书籍

示例

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();

传递功能标志

use cargo_metadata::{MetadataCommand, CargoOpt};

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

解析 message-format 输出

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");

依赖关系

~1–2MB
~40K SLoC