1. ホーム

[解決済み】RustプログラムがCargoパッケージからメタデータにアクセスする方法は?

2022-04-09 10:04:28

質問

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

解決方法は?

Cargoは、環境変数を通してコンパイラにいくつかのメタデータを渡しますが、そのリストは カーゴのドキュメントページ .

コンパイラの環境は fill_env をCargoのコードに追加しました。このコードは以前のバージョンから複雑になっており、変数のリスト全体が動的になりうるため、そこからではわからなくなっています。しかし、少なくとも次のような変数がそこに設定されている(from ドキュメントにあるリスト ):

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: &str = env!("CARGO_PKG_VERSION");

// ...

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

Cargo がなくてもプログラムをコンパイルできるようにしたい場合は option_env!() :

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

// ...

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