web-dev-qa-db-fra.com

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

Comment accéder 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 j'aimerais avoir un --version flag, et j'aimerais que l'implémentation lise la version du paquet depuis Cargo.toml donc je n'ai pas à le maintenir à deux endroits. Je peux imaginer qu'il existe d'autres raisons pour lesquelles quelqu'un pourrait également vouloir accéder aux métadonnées Cargo à partir du programme.

113
Jimmy Cuadra

Cargo transmet certaines métadonnées au compilateur via des variables d'environnement, dont une liste peut être trouvée dans les Pages de documentation Cargo .

L'environnement du compilateur est rempli par fill_env dans le code de Cargo. Ce code est devenu plus complexe depuis les versions antérieures, et la liste complète des variables n'est plus évidente car il peut être dynamique. Cependant, au moins les variables suivantes y sont définies (dans la liste des documents):

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 macro env!() . Pour insérer le numéro de version de votre programme, vous pouvez procéder comme suit:

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

// ...

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

Si vous voulez que votre programme 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"));
168
Vladimir Matveev

La caisse intégrée - aide à sérialiser beaucoup de l'environnement de Cargo sans tout le passe-partout.

9
user2722968