Jim*_*dra 123 rust rust-cargo
如何从包中的Rust代码访问Cargo包的元数据(例如版本)?在我的情况下,我正在构建一个命令行工具,我希望有一个标准的--version标志,我希望实现读取包的版本,Cargo.toml所以我不必在两个地方维护它.我可以想象还有其他人可能想要从程序中访问Cargo元数据.
Vla*_*eev 185
Cargo通过环境变量将一些元数据传递给编译器,其列表可以在Cargo文档页面中找到.
编译环境由fill_envCargo代码填充.自早期版本以来,此代码变得更加复杂,并且整个变量列表不再明显,因为它可以是动态的.但是,至少在那里设置了以下变量(从文档列表中):
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
Run Code Online (Sandbox Code Playgroud)
您可以使用env!()宏访问环境变量.要插入程序的版本号,您可以执行以下操作:
const VERSION: &'static str = env!("CARGO_PKG_VERSION");
// ...
println!("MyProgram v{}", VERSION);
Run Code Online (Sandbox Code Playgroud)
如果您希望程序在没有Cargo的情况下编译,您可以使用option_env!():
const VERSION: Option<&'static str> = option_env!("CARGO_PKG_VERSION");
// ...
println!("MyProgram v{}", VERSION.unwrap_or("unknown"));
Run Code Online (Sandbox Code Playgroud)
在构建时(如 中build.rs),cargo_metadata可能有用。例如:
let path = std::env::var("CARGO_MANIFEST_DIR").unwrap();
let meta = MetadataCommand::new()
.manifest_path("./Cargo.toml")
.current_dir(&path)
.exec()
.unwrap();
let root = meta.root_package().unwrap();
let option = root.metadata["my"]["option"].as_str().unwrap();
let version = &root.version;
...
Run Code Online (Sandbox Code Playgroud)