Làm thế nào một chương trình Rust có thể truy cập siêu dữ liệu từ gói Hàng hóa của nó?


150

Làm cách nào để bạn truy cập siêu dữ liệu của gói Hàng hóa (ví dụ: phiên bản) từ mã Rust trong gói hàng? Trong trường hợp của tôi, tôi đang xây dựng một công cụ dòng lệnh mà tôi muốn có một --versioncờ tiêu chuẩn và tôi muốn triển khai để đọc phiên bản của gói từ Cargo.tomlđó vì vậy tôi không phải duy trì nó ở hai nơi. Tôi có thể tưởng tượng có những lý do khác mà ai đó có thể muốn truy cập siêu dữ liệu của Cargo từ chương trình.

Câu trả lời:


219

Cargo chuyển một số siêu dữ liệu cho trình biên dịch thông qua các biến môi trường, một danh sách có thể tìm thấy trong các trang tài liệu của Cargo .

Môi trường trình biên dịch được điền bằng fill_envmã của Cargo. Mã này đã trở nên phức tạp hơn kể từ các phiên bản trước đó và toàn bộ danh sách các biến không còn rõ ràng từ nó bởi vì nó có thể là động. Tuy nhiên, ít nhất các biến sau được đặt ở đó (từ danh sách trong tài liệu):

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

Bạn có thể truy cập các biến môi trường bằng cách sử dụng env!()macro. Để chèn số phiên bản của chương trình, bạn có thể làm điều này:

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

// ...

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

Nếu bạn muốn chương trình của mình biên dịch ngay cả khi không có Hàng hóa, bạn có thể sử dụng option_env!():

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

// ...

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.