¿Cómo puede un programa Rust acceder a los metadatos de su paquete Cargo?

150

¿Cómo accede a los metadatos de un paquete Cargo (p. Ej., La versión) desde el código Rust del paquete? En mi caso, estoy construyendo una herramienta de línea de comando que me gustaría tener una --versionbandera estándar , y me gustaría que la implementación lea la versión del paquete Cargo.tomlpara no tener que mantenerla en dos lugares. Me imagino que también hay otras razones por las que alguien podría querer acceder a los metadatos de Cargo desde el programa.

Jimmy Cuadra
fuente

Respuestas:

219

Cargo pasa algunos metadatos al compilador a través de variables de entorno, cuya lista se puede encontrar en las páginas de documentación de Cargo .

El entorno del compilador se completa fill_enven el código de Cargo. Este código se ha vuelto más complejo desde versiones anteriores, y la lista completa de variables ya no es obvia porque puede ser dinámico. Sin embargo, al menos las siguientes variables se establecen allí (de la lista en los documentos):

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

Puede acceder a las variables de entorno utilizando la env!()macro. Para insertar el número de versión de su programa, puede hacer esto:

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

// ...

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

Si desea que su programa se compile incluso sin Cargo, puede usar option_env!():

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

// ...

println!("MyProgram v{}", VERSION.unwrap_or("unknown"));
Vladimir Matveev
fuente
13

La caja incorporada ayuda a serializar una gran parte del entorno de Cargo sin toda la caldera.

usuario2722968
fuente