Rust程序如何从其Cargo包中访问元数据?

时间:2015-01-08 12:41:59

标签: rust rust-cargo

如何从包中的Rust代码访问Cargo包的元数据(例如版本)?在我的情况下,我正在构建一个命令行工具,我希望有一个标准--version标志,我希望实现从Cargo.toml读取包的版本所以我不要不得不把它保存在两个地方。我可以想象还有其他人可能想要从程序中访问Cargo元数据。

2 个答案:

答案 0 :(得分:156)

Cargo通过环境变量将一些元数据传递给编译器,其列表可以在Cargo documentation pages中找到。

编译器环境由货物代码中的fill_env填充。自早期版本以来,此代码变得更加复杂,并且整个变量列表不再明显,因为它可以是动态的。但是,至少在那里设置了以下变量(来自文档中的列表):

CARGO_MANIFEST_DIR
CARGO_PKG_AUTHORS
CARGO_PKG_DESCRIPTION
CARGO_PKG_HOMEPAGE
CARGO_PKG_NAME
CARGO_PKG_REPOSITORY
CARGO_PKG_VERSION
CARGO_PKG_VERSION_MAJOR
CARGO_PKG_VERSION_MINOR
CARGO_PKG_VERSION_PATCH
CARGO_PKG_VERSION_PRE

您可以使用env!()宏访问环境变量。要插入程序的版本号,您可以执行以下操作:

const VERSION: &'static str = env!("CARGO_PKG_VERSION");

// ...

println!("MyProgram v{}", VERSION);

如果您希望程序在没有Cargo的情况下进行编译,则可以使用option_env!()

const VERSION: Option<&'static str> = option_env!("CARGO_PKG_VERSION");

// ...

println!("MyProgram v{}", VERSION.unwrap_or("unknown"));

答案 1 :(得分:7)

built - crate有助于在没有所有样板的情况下序列化大量货物环境。