Rust程序如何从其货物包访问元数据?

Rust程序如何从其货物包访问元数据?,rust,rust-cargo,Rust,Rust Cargo,如何从包装中的防锈代码访问货物包装的元数据(例如版本)?在我的例子中,我正在构建一个命令行工具,我希望有一个标准的--version标志,并且我希望实现从Cargo.toml读取包的版本,这样我就不必在两个地方维护它。我可以想象,有人可能还想从程序中访问Cargo元数据还有其他原因。Cargo通过环境变量将一些元数据传递给编译器,环境变量的列表可以在中找到 编译器环境由in Cargo的代码填充。自早期版本以来,此代码变得更加复杂,并且整个变量列表不再明显,因为它可以是动态的。但是,至少在那里设

如何从包装中的防锈代码访问货物包装的元数据(例如版本)?在我的例子中,我正在构建一个命令行工具,我希望有一个标准的
--version
标志,并且我希望实现从
Cargo.toml
读取包的版本,这样我就不必在两个地方维护它。我可以想象,有人可能还想从程序中访问Cargo元数据还有其他原因。

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

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

CARGO\u MANIFEST\u DIR
CARGO_PKG_作者
货物包装描述
货物包装主页
货物包装名称
货物包装仓库
货物包装版
货物包装版本专业
货物包装版本小号
货物包装版本补丁
货物包装版本预
可以使用宏访问环境变量。要插入程序的版本号,可以执行以下操作:

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

// ...

println!("MyProgram v{}", VERSION);
如果您希望在没有货物的情况下编译程序,可以使用:


const VERSION:Option板条箱有助于序列化大量Cargo的环境,而无需所有的样板文件。

这是运行时还是编译时?@debuti编译时,如上所述
builded
还添加了git sha-1(以及许多其他有用的东西)
const VERSION: Option<&'static str> = option_env!("CARGO_PKG_VERSION");

// ...

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