Как программа Rust может получить доступ к метаданным из своего пакета Cargo?


150

Как получить доступ к метаданным пакета Cargo (например, версии) из кода Rust в пакете? В моем случае я создаю инструмент командной строки, который хотел бы иметь стандартный --versionфлаг, и я хотел бы, чтобы реализация считывала версию пакета, Cargo.tomlпоэтому мне не нужно поддерживать ее в двух местах. Я могу представить, что есть и другие причины, по которым кто-то может захотеть получить доступ к метаданным Cargo из программы.

Ответы:


220

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"));

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.