web-dev-qa-db-ja.com

どうすればRustプログラムはCargoパッケージのメタデータにアクセスできますか?

パッケージ内のRustコードからCargoパッケージのメタデータ(バージョンなど)にアクセスするにはどうすればよいですか?私の場合、標準の--versionが必要なコマンドラインツールを作成しています。フラグを設定し、実装がCargo.tomlからパッケージのバージョンを読み取るようにしたいので、2か所でメンテナンスする必要はありません。プログラムからCargoメタデータにアクセスしたい理由は他にもあると思います。

113
Jimmy Cuadra

Cargoは環境変数を介してコンパイラにメタデータを渡します。環境変数のリストは Cargo documentation pages にあります。

コンパイラー環境には、Cargoのコードで _fill_env_ が設定されています。このコードは以前のバージョンからより複雑になり、変数のリスト全体が動的になる可能性があるため、それからはもはや明らかではありません。ただし、少なくとも次の変数がそこに設定されています(ドキュメントのリストから)。

_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
_

env!() マクロを使用して環境変数にアクセスできます。プログラムのバージョン番号を挿入するには、次を実行できます。

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

// ...

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

Cargoがなくてもプログラムをコンパイルしたい場合は、 option_env!() を使用できます。

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

// ...

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

built -crateは、ボイラープレートなしで多くのCargo環境をシリアル化するのに役立ちます。

9
user2722968