👻

バージョン実装する時に便利だよ、vergen

2025/01/10に公開

バイナリ作った時に、バージョン入れときたいじゃないですか。でも、更新毎に「1.0」とか「1.0.0」とか入れるの、めんどくさいじゃないですか。ちゃんと作るならリリース毎に追加した機能とか書いて、タグを打つべきなんでしょうけど。そこまでしたくもない。このバイナリが何なのかだけわかればいい。そういうことってあると思うんですけど。そういう時に便利ですよ、vergen

これ、何する crate かというと、メタデータを環境変数に突っ込んでくれる crate なんですね。公式ドキュメント見れば5秒でわかるんですけど。

cargo add vergen-gitcl --features cargo

これで入れて。

build.rs
fn main() -> anyhow::Result<()> {
    Emitter::default()
        .add_instructions(&CargoBuilder::all_cargo()?)?
        .add_instructions(&GitclBuilder::all_git()?)?
        .emit()?;
}

これを build.rs で実行しておくと。

main.rs
const VERSION: &str = concat!(
    env!("VERGEN_GIT_COMMIT_TIMESTAMP"),
    " : ",
    env!("VERGEN_GIT_SHA"),
    " : ",
    env!("VERGEN_CARGO_TARGET_TRIPLE"),
);


#[derive(Parser)]
#[command(author, version = VERSION)]
struct Cli {
    #[arg(short, long, value_name = "FILE")]
    config: PathBuf,
}

こういう感じで、コード内でメタデータを使用することができるようになります。

cargo run -- --version
<name> 2024-01-30T21:43:43.000000000Z : 728e25ca5bb7edbbc505f12b28c66b2b27883cf1 : x86_64-unknown-linux-gnu

実行すると、こんな感じで結果が出ます。はい、便利。これの何がいいって、一回入れちゃえばメンテナンスフリーだというところです。自分が意識して何かしなくても、勝手にバイナリと github の hash が紐づきます。github と照合すれば、そのバイナリが何なのか、一発でわかります。しかも、入れるのも簡単。build.rs にコピペして、clap にでも結びつけておくだけでいい。

もっとしっかり作り込みたい人には不要な知識かもしれませんが。プライベートでツール作るくらいなら、これくらいでも十分に役に立つので。おすすめです。

Discussion