#cargo-metadata #output #executable #serde #access #structured #alt-serde

alt_cargo_metadata

alt_cargo_metadata是cargo_metadata的一个副本,它使用alt_serde而不是serde。这存在是为了解决cargo功能统一问题4866,也请参阅https://github.com/oli-obk/cargo_metadata/issues/98

1个不稳定版本

使用旧Rust 2015

0.9.1 2020年1月8日

1466编码

MIT许可证

38KB
535

cargo_metadata

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

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

Build Status crates.io

文档 - 包含使用std::env::argsdocoptclapstructopt的示例。


lib.rs:

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

有关cargo本身的详细信息,请参阅cargo手册

示例

使用 std::env::args()

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

使用 docopt

const USAGE: &str = "
    Cargo metadata test function

    Usage:
      cargo_metadata [--manifest-path PATH]
";

#[derive(Debug, Deserialize)]
struct Args {
    arg_manifest_path: Option<String>,
}

let args: Args = Docopt::new(USAGE)
    .and_then(|d| d.deserialize())
    .unwrap_or_else(|e| e.exit());

let mut cmd = cargo_metadata::MetadataCommand::new();
if let Some(path) = args.arg_manifest_path {
    cmd.manifest_path(path);
}
let _metadata = cmd.exec().unwrap();

使用 clap

let matches = clap::App::new("myapp")
    .arg(
        clap::Arg::with_name("manifest-path")
            .long("manifest-path")
            .value_name("PATH")
            .takes_value(true),
    )
    .get_matches();

let mut cmd = cargo_metadata::MetadataCommand::new();
if let Some(path) = matches.value_of("manifest-path") {
    cmd.manifest_path(path);
}
let _metadata = cmd.exec().unwrap();

使用 structopt

#[derive(Debug, StructOpt)]
struct Opt {
    #[structopt(name = "PATH", long="manifest-path", parse(from_os_str))]
    manifest_path: Option<PathBuf>,
}

let opt = Opt::from_args();
let mut cmd = cargo_metadata::MetadataCommand::new();
if let Some(path) = opt.manifest_path {
    cmd.manifest_path(path);
}
let _metadata = cmd.exec().unwrap();

传递功能标志

use cargo_metadata::{MetadataCommand, CargoOpt};

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

解析消息格式输出

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

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

for message in cargo_metadata::parse_messages(command.stdout.take().unwrap()) {
    match message.unwrap() {
        Message::CompilerMessage(msg) => {
            println!("{:?}", msg);
        },
        Message::CompilerArtifact(artifact) => {
            println!("{:?}", artifact);
        },
        Message::BuildScriptExecuted(script) => {
            println!("{:?}", script);
        },
        _ => () // Unknown message
    }
}

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

依赖项

~2.5MB
~62K SLoC