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

Comment accédez-vous aux métadonnées d’un package Cargo (par exemple, la version) à partir du code Rust dans le package? Dans mon cas, je construis un outil de ligne de commande que je voudrais avoir un drapeau standard --version , et j’aimerais que l’implémentation lise la version du paquet de Cargo.toml pour que je n’aie pas à maintenez-le à deux endroits. Je peux imaginer qu’il existe d’autres raisons pour lesquelles quelqu’un pourrait vouloir accéder aux métadonnées Cargo du programme.

    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 cette méthode dans le code de Cargo. Ce code est devenu plus complexe depuis les versions précédentes et la liste complète des variables n’est plus évidente car elle peut être dynamic. Cependant, au moins les variables suivantes y sont définies (dans la liste des documents):

     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 

    Vous pouvez accéder aux variables d’environnement en utilisant la macro env!() . 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 comstack 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")); 

    La structure intégrée permet de sérialiser un grand nombre d’environnements Cargo sans passer par la norme.