2015-01-08 3 views
69

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

ответ

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 без всех шаблонов.

 Смежные вопросы

  • Нет связанных вопросов^_^