萌えハッカーニュースリーダー

2025/11/10 18:50 Exposing Git Information in Rust Binaries Built with Nix

出典: https://lgug2z.com/articles/exposing-git-information-in-rust-binaries-built-with-nix/
hakase
博士

やあ、ロボ子。最近、ソフトウェアのバージョン管理がますます重要になっているのじゃ。特に、多くの人が使うようになると、いろんなバージョンが飛び交うからの。

roboko
ロボ子

確かにそうですね、博士。技術者やパワーユーザーは、公式リリース版だけでなく、特定のコミットハッシュを使うこともありますし。

hakase
博士

そうそう。そこで、Windowsで`--version`フラグを使ったときに、コミット情報を提供できるようにすると、問題の特定にすごく役立つというわけじゃ。

roboko
ロボ子

`shadow-rs`クレートと`clap`クレートが、それを実現するのに役立つんですね。

hakase
博士

`shadow-rs`はビルド時にgitの情報を取得して、`CLAP_LONG_VERSION`と組み合わせて詳細なビルド情報を提供してくれるのじゃ。例えば、「komorebi 0.1.38, commit_hash:21cb5e1e, build_time:2025-06-10 00:26:27 +02:00」みたいな感じじゃな。

roboko
ロボ子

なるほど。そして、Nix flakeを使うと、再現可能なビルドができるようになるんですね。macOSへの移植もされたとのこと。

hakase
博士

`nix build`でプロジェクトをビルドできるようになったのは大きいぞ。`crane`を使って、コンパイルに必要なファイルをフィルタリングするのもポイントじゃ。

roboko
ロボ子

でも、`.git`ディレクトリは通常除外されるから、`shadow-rs`はコミット情報を抽出できないんですね。

hakase
博士

そこがミソじゃ! Nix flakeは現在のgitリビジョンを`inputs.self.rev`で公開してくれるから、これをビルド時の環境変数として設定すれば良いのじゃ。

roboko
ロボ子

`flake.nix`で`COMMIT_HASH`を設定するんですね。でも、gitブランチ名を取得する方法は見つからなかったと。

hakase
博士

まあ、そこはご愛嬌じゃ。そして、`build.rs`を修正して、`nix build`経由で呼び出された場合でも適切に動作するようにするのじゃ。

roboko
ロボ子

`BRANCH`が設定されていない場合は、カスタムフックを使って`commit_hash`の値を取得するんですね。

hakase
博士

そう!そして、`RAW_VERSION_CONST`と`FLAKE_VERSION_CONST`を生成して、`version = LONG_VERSION`で参照できるようにするのじゃ。

roboko
ロボ子

`cargo build`と`nix build`の両方で、詳細なバージョン情報を返せるようになったんですね。`nix build`の場合は「commit_hash:4e8caf2b2a777cf8dbc75fbaa87d98406e6bc390」、`cargo build`の場合は「branch:master, commit_hash:4e8caf2b2a777cf8dbc75fbaa87d98406e6bc390」というように。

hakase
博士

そういうことじゃ!これで、誰がどのバージョンのソフトウェアを使っているか、一目瞭然じゃな!

roboko
ロボ子

IsabelとIvanに感謝ですね。ところで博士、バージョン管理といえば、博士の部屋の整理整頓もバージョン管理が必要なのでは?

hakase
博士

むむ、それは言わない約束じゃなかったかの…!最新版はいつも混沌としているのじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search