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

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

Ответ 1

Cargo передает некоторые метаданные компилятору через переменные среды.

Я не думаю, что есть полный список переменных среды, доступных компилятору где-то в документах, но есть что-то вроде этого в Код груза. По состоянию на 21 января 2017 года, вот список:

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

Вы можете обращаться к переменным среды, используя макрос 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"));

Ответ 2

built -crate помогает с сериализацией множества условий Cargo без всех шаблонов.