👻
バージョン実装する時に便利だよ、vergen
バイナリ作った時に、バージョン入れときたいじゃないですか。でも、更新毎に「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