Cargo.toml とは Rust のビルドツール cargo が読み書きするファイルで、パッケージについての情報が記述されている。配布用の zip ファイルを生成する際などに、ここからバージョンナンバーを自動で抽出できたら便利だ。
cargo metadata
というコマンドで、Cargo.toml の内容を JSON 化できる。
$ cargo metadata --no-deps --format-version 1 {"packages":[{"name":"sponge","version":"0.1.0","id":"sponge 0.1.0 (path+file:///C:/Users/hymkor/src/sponge-rs)","license":null,"license_file":null,"description":null,"source":null,"dependencies":[],"targets":[{"kind":["bin"],"crate_types":["bin"],"name":"sponge","src_path":"C:\\Users\\hymkor\\src\\sponge-rs\\src\\main.rs","edition":"2021","doc":true,"doctest":false,"test":true}],"features":{},"manifest_path":"C:\\Users\\hymkor\\src\\sponge-rs\\Cargo.toml","metadata":null,"publish":null,"authors":[],"categories":[],"keywords":[],"readme":"README.md","repository":null,"homepage":null,"documentation":null,"edition":"2021","links":null,"default_run":null,"rust_version":null}],"workspace_members":["sponge 0.1.0 (path+file:///C:/Users/hymkor/src/sponge-rs)"],"workspace_default_members":["sponge 0.1.0 (path+file:///C:/Users/hymkor/src/sponge-rs)"],"resolve":null,"target_directory":"C:\\Users\\hymkor\\src\\sponge-rs\\target","version":1,"workspace_root":"C:\\Users\\hymkor\\src\\sponge-rs","metadata":null}
Windows の場合は、PowerShell で JSON を読み取ることができる。
powershell "(cargo metadata --no-deps --format-version 1 | ConvertFrom-Json).packages.version" 0.1.0
Makefile で変数として VERSION を設定するには shell 関数を使えばよい。
VERSION:=v$(shell powershell "(cargo metadata --no-deps --format-version 1 | ConvertFrom-Json).packages.version")
$ cargo metadata --no-deps --format-version 1 | jq .packages[0].version "0.1.0"
ただし、jq は常に OS にインストールされているとは限らない。gawk で代用すると
VERSION:=v$(shell gawk '/version/{ gsub(/[="]/,"",$$NF) ; print $$NF ; exit }' Cargo.toml)
となる。ただし、toml ファイルの構造をきちんと処理しているわけではないため、誤認識する可能性がある。