如何从包装中的 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"));

Rust相关问答推荐

无需通过ASIO输入音频,并使用cpal进行反馈示例

为什么我们不能通过指针算法将Rust原始指针指向任意地址?'

为什么复印是豆荚的一个重要特征?

在函数内定义impl和在函数外定义impl的区别

通过解引用将值移出Box(以及它被脱糖到什么地方)?

支持TLS的模拟HTTP服务器

Trait bound i8:来自u8的不满意

如何创建一个可变的嵌套迭代器?

如何迭代属性以判断相等性?

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

装箱特性如何影响传递给它的参数的生命周期 ?(举一个非常具体的例子)

为什么HashMap::get和HashMap::entry使用不同类型的密钥?

Rust 并行获取对 ndarray 的每个元素的可变引用

有什么方法可以通过使用生命周期来减轻嵌套生成器中的当生成器产生时borrow 可能仍在使用错误?

为什么不能在 Rust 中声明静态或常量 std::path::Path 对象?

如何在 Rust 中按 char 对字符串向量进行排序?

只有一个字符被读入作为词法分析器的输入

使用部分键从 Hashmap 中检索值

类型组的通用枚举

编写 TOML 文件以反序列化为 struct 中的枚举