Як програма Rust може отримати доступ до метаданих зі свого пакету Cargo?


150

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

Відповіді:


220

Вантаж передає деякі метадані компілятору через змінні середовища, перелік яких можна знайти на сторінках вантажної документації .

Середовище компілятора заповнюється 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.