Como um programa Rust pode acessar metadados de seu pacote Cargo?

150

Como você acessa os metadados de um pacote Cargo (por exemplo, versão) a partir do código Rust no pacote? No meu caso, estou criando uma ferramenta de linha de comando da qual gostaria de ter um --versionsinalizador padrão e gostaria que a implementação lesse a versão do pacote Cargo.tomlpara não precisar mantê-lo em dois lugares. Eu posso imaginar que existem outras razões pelas quais alguém pode querer acessar os metadados do Cargo também.

Jimmy Cuadra
fonte

Respostas:

219

O Cargo passa alguns metadados para o compilador através de variáveis ​​de ambiente, cuja lista pode ser encontrada nas páginas de documentação do Cargo .

O ambiente do compilador é preenchido fill_envno código do Cargo. Esse código se tornou mais complexo desde as versões anteriores, e a lista inteira de variáveis ​​não é mais óbvia, porque pode ser dinâmica. No entanto, pelo menos as seguintes variáveis ​​são definidas lá (na lista nos documentos):

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

Você pode acessar variáveis ​​de ambiente usando a env!()macro. Para inserir o número da versão do seu programa, você pode fazer o seguinte:

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

// ...

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

Se você deseja que seu programa seja compilado mesmo sem o Cargo, você pode usar option_env!():

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

// ...

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

A caixa integrada ajuda a serializar muito do ambiente da Cargo sem todo o padrão.

user2722968
fonte