Wie kann ein Rust-Programm über sein Frachtpaket auf Metadaten zugreifen?

150

Wie greifen Sie über den Rust-Code im Paket auf die Metadaten eines Frachtpakets (z. B. Version) zu? In meinem Fall --versionerstelle ich ein Befehlszeilentool, für das ich ein Standardflag haben möchte , und ich möchte, dass die Implementierung die Version des Pakets liest, Cargo.tomldamit ich es nicht an zwei Stellen warten muss. Ich kann mir vorstellen, dass es noch andere Gründe gibt, warum jemand über das Programm auf Cargo-Metadaten zugreifen möchte.

Jimmy Cuadra
quelle

Antworten:

219

Cargo übergibt einige Metadaten über Umgebungsvariablen an den Compiler. Eine Liste davon finden Sie auf den Cargo-Dokumentationsseiten .

Die Compiler-Umgebung wird fill_envim Code von Cargo gefüllt. Dieser Code ist seit früheren Versionen komplexer geworden, und die gesamte Liste der Variablen ist daraus nicht mehr ersichtlich, da er dynamisch sein kann. Dort werden jedoch mindestens die folgenden Variablen festgelegt (aus der Liste in den Dokumenten):

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

Sie können mit dem env!()Makro auf Umgebungsvariablen zugreifen . So geben Sie die Versionsnummer Ihres Programms ein:

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

// ...

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

Wenn Sie möchten, dass Ihr Programm auch ohne Fracht kompiliert wird, können Sie Folgendes verwenden option_env!():

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

// ...

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

Die eingebaute Kiste hilft bei der Serialisierung eines Großteils der Cargo-Umgebung ohne die gesamte Boilerplate.

user2722968
quelle