2015-01-08 12 views
69

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? 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 tiêu chuẩn --version cờ, và tôi muốn thực hiện để đọc phiên bản của gói từ Cargo.toml vì vậy tôi không phải duy trì nó trong hai nơi. Tôi có thể tưởng tượng có những lý do khác mà ai đó cũng muốn truy cập siêu dữ liệu Cargo từ chương trình.Làm cách nào để chương trình Rust truy cập siêu dữ liệu từ gói Hàng hóa của mình?

Trả lời

102

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

Môi trường trình biên dịch được điền bởi this method trong mã 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 nữa bởi vì nó có thể là động. Tuy nhiên, ít nhất là các biến sau đây được đặt ở đó (từ danh sách trong tài liệu):

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 

Bạn có thể truy cập các biến môi trường bằng cách sử dụng env!() vĩ mô. Để 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 bạn để biên dịch thậm chí 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")); 
5

Các built -crate giúp với serializing rất nhiều môi trường của Cargo mà không có tất cả các boilerplate.

Các vấn đề liên quan