Как вы получаете доступ к метаданным пакета Cargo пакета (например, версии) из кода Rust в пакете? В моем случае я создаю инструмент командной строки, который хотел бы иметь стандартный флаг --version
, и мне бы хотелось, чтобы реализация прочитала версию пакета с Cargo.toml
, поэтому мне не нужно поддерживать ее в двух мест. Я могу представить, что есть другие причины, по которым кто-то может захотеть получить доступ к метаданным Cargo из программы.Как программа Rust может получать метаданные из своего пакета Cargo?
69
A
ответ
102
Cargo передает некоторые метаданные компилятору через переменные среды, список которых можно найти в файле Cargo documentation pages.
Среда компилятора заполнена this method кодом Cargo. Этот код стал более сложным с более ранних версий, и весь список переменных уже не является очевидным из-за его динамичности. Однако, по крайней мере, следующие переменные устанавливаются там (из списка в документации):
CARGO
CARGO_MANIFEST_DIR
CARGO_PKG_VERSION_MAJOR
CARGO_PKG_VERSION_MINOR
CARGO_PKG_VERSION_PATCH
CARGO_PKG_VERSION_PRE
CARGO_PKG_VERSION
CARGO_PKG_NAME
CARGO_PKG_DESCRIPTION
CARGO_PKG_HOMEPAGE
CARGO_PKG_AUTHORS
OUT_DIR
Вы можете получить доступ к переменным окружения с помощью env!()
макроса. Для того, чтобы вставить номер версии вашей программы вы можете сделать это:
const VERSION: &'static str = env!("CARGO_PKG_VERSION");
// ...
println!("MyProgram v{}", VERSION);
Если вы хотите, чтобы ваша программа компилировать даже без груза, вы можете использовать option_env!()
:
const VERSION: Option<&'static str> = option_env!("CARGO_PKG_VERSION");
// ...
println!("MyProgram v{}", VERSION.unwrap_or("unknown"));
5
built -crate помогает сериализации много окружающей среды Cargo без всех шаблонов.