W jaki sposób program Rust może uzyskać dostęp do metadanych z pakietu Cargo?

150

Jak uzyskać dostęp do metadanych pakietu Cargo (np. Wersji) z kodu Rusta w pakiecie? W moim przypadku buduję narzędzie wiersza poleceń, które chciałbym mieć standardową --versionflagę i chciałbym, aby implementacja czytała wersję pakietu z, Cargo.tomlwięc nie muszę go utrzymywać w dwóch miejscach. Mogę sobie wyobrazić, że są inne powody, dla których ktoś mógłby chcieć uzyskać dostęp do metadanych Cargo również z programu.

Jimmy Cuadra
źródło

Odpowiedzi:

220

Cargo przekazuje niektóre metadane do kompilatora poprzez zmienne środowiskowe, których listę można znaleźć na stronach dokumentacji Cargo .

Środowisko kompilatora jest wypełniane przez fill_envw kodzie Cargo. Ten kod stał się bardziej złożony od czasu wcześniejszych wersji, a cała lista zmiennych nie jest już z niego oczywista, ponieważ może być dynamiczna. Jednak przynajmniej następujące zmienne są tam ustawione (z listy w dokumentacji):

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

Dostęp do zmiennych środowiskowych można uzyskać za pomocą env!()makra. 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 kompilował się nawet bez Cargo, możesz użyć option_env!():

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

// ...

println!("MyProgram v{}", VERSION.unwrap_or("unknown"));
Vladimir Matveev
źródło
13

Zbudowany -crate pomaga szeregowania dużo środowisku Cargo bez wszystkich boilerplate.

user2722968
źródło