概要
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プロジェクトの情報だけを出力できます