標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

Cargo.toml からバージョンを抽出する

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 の場合は、PowerShellJSON を読み取ることができる。

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")

Linux の場合、jq を使えばよいらしい。1

$ 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 ファイルの構造をきちんと処理しているわけではないため、誤認識する可能性がある。