Comment un programme Rust peut-il accéder aux métadonnées de son package Cargo?

150

Comment accéder aux métadonnées d'un package Cargo (par exemple, la version) à partir du code Rust du package? Dans mon cas, je construis un outil de ligne de commande dont j'aimerais avoir un --versionindicateur standard , et j'aimerais que l'implémentation lise la version du paquet à partir de Cargo.tomlsorte que je n'ai pas à le maintenir à deux endroits. J'imagine qu'il y a d'autres raisons pour lesquelles quelqu'un pourrait également vouloir accéder aux métadonnées Cargo à partir du programme.

Jimmy Cuadra
la source

Réponses:

220

Cargo transmet certaines métadonnées au compilateur via des variables d'environnement, dont une liste se trouve dans les pages de documentation de Cargo .

L'environnement du compilateur est rempli par fill_envdans le code de Cargo. Ce code est devenu plus complexe depuis les versions précédentes, et la liste entière des variables n'en ressort plus évidente car elle peut être dynamique. Cependant, au moins les variables suivantes y sont définies (à partir de la liste de la documentation):

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

Vous pouvez accéder aux variables d'environnement à l'aide de la env!()macro. Pour insérer le numéro de version de votre programme, vous pouvez le faire:

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

// ...

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

Si vous voulez que votre programme se compile même sans Cargo, vous pouvez utiliser option_env!():

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

// ...

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

Le construit -crate aide à la sérialisation beaucoup de l'environnement Cargo , sans tous les passe- partout.

utilisateur2722968
la source