如何从包装中的Rust代码访问货运包装的元数据(例如版本)?就我而言,我正在构建一个命令行工具,我希望它具有一个标准--version
标志,并且我希望实现能够从中读取软件包的版本,Cargo.toml
因此我不必在两个地方进行维护。我可以想象还有其他原因,可能有人也希望从该程序访问Cargo元数据。
如何从包装中的Rust代码访问货运包装的元数据(例如版本)?就我而言,我正在构建一个命令行工具,我希望它具有一个标准--version
标志,并且我希望实现能够从中读取软件包的版本,Cargo.toml
因此我不必在两个地方进行维护。我可以想象还有其他原因,可能有人也希望从该程序访问Cargo元数据。
Answers:
Cargo通过环境变量将一些元数据传递给编译器,可以在Cargo文档页面中找到其列表。
编译器环境由fill_env
Cargo代码填充。自早期版本以来,该代码已变得更加复杂,并且由于它是动态的,因此从中看不到变量的完整列表。但是,至少在此处设置了以下变量(来自文档列表):
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"));