Jak program Rust może uzyskać dostęp do metadanych z pakietu Cargo?

Jak uzyskać dostęp do metadanych pakietu Cargo (np. wersji) z kodu Rust w pakiecie? W moim przypadku buduję narzędzie wiersza poleceń, które chciałbym mieć standardową flagę --version i chciałbym, aby implementacja odczytała wersję pakietu z Cargo.toml, więc nie muszę jej utrzymywać w dwóch miejscach. Mogę sobie wyobrazić, że są inne powody, dla których ktoś może chcieć uzyskać dostęp do Metadanych ładunku z programu.

Author: Jimmy Cuadra, 2015-01-08

2 answers

Cargo przekazuje niektóre metadane do kompilatora za pomocą zmiennych środowiskowych, których listę można znaleźć na stronach dokumentacji ładunku .

Środowisko kompilatora jest wypełnione tą metodą w kodzie Cargo. Kod ten stał się bardziej złożony od wcześniejszych wersji, a cała lista zmiennych nie jest już z niego oczywista, ponieważ może być dynamiczna. Są tam jednak ustawione przynajmniej następujące zmienne (z listy w dokumentach):

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

Możesz uzyskać dostęp do zmiennych środowiskowych za pomocą env!() makro. Aby wstawić numer wersji programu możesz to zrobić:

const VERSION: &'static str = env!("CARGO_PKG_VERSION");

// ...

println!("MyProgram v{}", VERSION);

Jeśli chcesz, aby twój program skompilował się nawet bez ładunku, możesz użyć option_env!():

const VERSION: Option<&'static str> = option_env!("CARGO_PKG_VERSION");

// ...

println!("MyProgram v{}", VERSION.unwrap_or("unknown"));
 125
Author: Vladimir Matveev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-12 13:44:53

Zbudowany-crate pomaga w serializacji środowiska ładunku bez całej płyty kotła.

 6
Author: user2722968,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-22 12:31:22