Bagaimana program Rust mengakses metadata dari paket Cargo-nya?

150

Bagaimana Anda mengakses metadata paket Cargo (misalnya versi) dari kode Rust dalam paket? Dalam kasus saya, saya sedang membangun alat baris perintah yang saya ingin memiliki --versionbendera standar , dan saya ingin implementasinya untuk membaca versi paket dari Cargo.tomljadi saya tidak harus mempertahankannya di dua tempat. Saya bisa membayangkan ada alasan lain seseorang mungkin ingin mengakses metadata Cargo dari program juga.

Jimmy Cuadra
sumber

Jawaban:

219

Cargo meneruskan beberapa metadata ke kompiler melalui variabel lingkungan, daftar yang dapat ditemukan di halaman dokumentasi Cargo .

Lingkungan kompiler diisi oleh fill_envdalam kode Cargo. Kode ini menjadi lebih kompleks sejak versi sebelumnya, dan seluruh daftar variabel tidak lagi jelas karena bisa dinamis. Namun, setidaknya variabel-variabel berikut diatur di sana (dari daftar di dokumen):

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

Anda dapat mengakses variabel lingkungan menggunakan env!()makro. Untuk memasukkan nomor versi program Anda, Anda dapat melakukan ini:

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

// ...

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

Jika Anda ingin program Anda dikompilasi bahkan tanpa Cargo, Anda dapat menggunakan option_env!():

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

// ...

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

The dibangun -crate membantu dengan serialisasi banyak lingkungan Cargo tanpa semua boilerplate.

pengguna2722968
sumber