1个不稳定版本
使用旧Rust 2015
0.9.1 | 2020年1月8日 |
---|
在1466个编码中
38KB
535 行
cargo_metadata
对cargo metadata
输出的结构化访问。通常用于cargo-*
可执行文件中。
还支持序列化,有助于在cargo-*
子命令中生成类似于--message-format=json
的输出,因为一些由cargo --message-format=json
生成的类型与cargo metadata
中的类型完全相同。
文档 - 包含使用std::env::args
、docopt
、clap
和structopt
的示例。
lib.rs
:
对cargo metadata
和cargo --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();
使用 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