LoginSignup
5
2

More than 5 years have passed since last update.

cargo metadataでプロジェクトの情報を取得する

Posted at

概要

Rustを使った開発をしていて、パッケージ自体の情報を知りたくなることがたまにあります。
例えば、Makefile内でパッケージの情報を使う場合や、自動ドキュメンテーションを行う場合です。
Cargo.tomlを参照するという力技もありますが、cargo metadataを使うとCargo.tomlに書かれていない情報も含めて、簡単にそれを取得できます。
json形式で出力されるので、jqを使って容易に加工できます。

基本

$ cargo init --bin ferris
$ cd ferris
$ ls
Cargo.lock Cargo.toml src
$ cargo metadata --format-version=1
{"packages":[{"name":"ferris","version":"0.1.0","id":"ferris 0.1.0 (path+file:///path/to/ferris)","license":null,"license_file":null,"description":null,"source":null,"dependencies":[],"targets":[{"kind":["bin"],"crate_types":["bin"],"name":"ferris","src_path":"/path/to/ferris/src/main.rs"}],"features":{},"manifest_path":"/path/to/ferris/Cargo.toml"}],"workspace_members":["ferris 0.1.0 (path+file:///path/to/ferris)"],"resolve":{"nodes":[{"id":"ferris 0.1.0 (path+file:///path/to/ferris)","dependencies":[]}],"root":"ferris 0.1.0 (path+file:///path/to/ferris)"},"target_directory":"/path/to/ferris/target","version":1}
$ cargo metadata --format-version=1 | jq .packages[0].name
"ferris"

Cargo.tomlを書き換えると出力される結果も変わります。

$ cargo metadata --format-version=1 | jq '.packages | map(select( .name == "ferris" )) | .[0].dependencies'
[]
$ echo 'regex = "0.2.2"' >> Cargo.toml
$ cargo metadata --format-version=1 | jq '.packages | map(select( .name == "ferris" )) | .[0].dependencies'
    Updating registry `https://github.com/rust-lang/crates.io-index`
[
  {
    "name": "regex",
    "source": "registry+https://github.com/rust-lang/crates.io-index",
    "req": "^0.2.2",
    "kind": null,
    "optional": false,
    "uses_default_features": true,
    "features": [],
    "target": null
  }
]

依存パッケージの情報を含めない

先の例で、jqで検索処理を行なっていますが、これはcargo metadataが依存パッケージも含めて全てのメタデータを出力するためです。
--no-depsオプションをつけると、ルートパッケージの情報だけを出力します。
多くの場合はこのオプションをつけた時の情報で必要十分と思います。
先の例は--no-deps を使うと以下のように書けます(結果は変わりません)。

$ cargo metadata --format-version=1 --no-deps | jq .packages[0].dependencies
[
  {
    "name": "regex",
    "source": "registry+https://github.com/rust-lang/crates.io-index",
    "req": "^0.2.2",
    "kind": null,
    "optional": false,
    "uses_default_features": true,
    "features": [],
    "target": null
  }
]

Makefileの中で使う

Makefileの中でcargo metadataを使ってみます。

.PHONY: version
version:
    @echo $(shell cargo metadata --format-version=1 --no-deps \
        | jq .packages[0].version)

実行してみます。

$ make version
0.1.0

まとめ

  • cargo metadataでプロジェクトの情報をjson形式で出力できます
  • --no-depsをつけるとrootプロジェクトの情報だけを出力できます
5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2