如何从包装中的 rust 迹代码访问Cargo 包装的元数据(例如版本)?在我的例子中,我正在构建一个命令行工具,我希望有一个标准的--version
标志,我希望实现从Cargo.toml
读取包的版本,这样我就不必在两个地方维护它.我可以想象,有人可能还想从该程序访问Cargo 元数据,还有其他原因.
如何从包装中的 rust 迹代码访问Cargo 包装的元数据(例如版本)?在我的例子中,我正在构建一个命令行工具,我希望有一个标准的--version
标志,我希望实现从Cargo.toml
读取包的版本,这样我就不必在两个地方维护它.我可以想象,有人可能还想从该程序访问Cargo 元数据,还有其他原因.
Cargo通过环境变量将一些元数据传递给编译器,环境变量的列表可以在Cargo documentation pages中找到.
编译器环境由Cargo的代码中的fill_env
填充.自早期版本以来,这段代码变得更加复杂,整个变量列表不再明显,因为它可以是动态的.但是,至少设置了以下变量(从the list in the docs开始):
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: &str = env!("CARGO_PKG_VERSION");
// ...
println!("MyProgram v{}", VERSION);
如果你想让你的程序即使没有Cargo 也能编译,你可以使用option_env!()
:
const VERSION: Option<&str> = option_env!("CARGO_PKG_VERSION");
// ...
println!("MyProgram v{}", VERSION.unwrap_or("unknown"));