1. ホーム
  2. c#

[解決済み] .NetのDLLにgitのコミットハッシュを埋め込む

2022-09-02 16:58:37

質問

C#のアプリケーションを作成しています。バージョン管理にはGitを使っています。

アプリケーションをビルドする際に、最後のコミットハッシュを実行ファイルに自動的に埋め込む方法はありますか?

例えば、コミットハッシュをコンソールに出力すると、以下のようになります。

class PrintCommitHash
{
    private String lastCommitHash = ?? // What do I put here?
    static void Main(string[] args)
    {
        // Display the version number:
        System.Console.WriteLine(lastCommitHash );
    }
}

なお、これは ビルド の時に行わなければなりません。 ランタイム というのは、私のデプロイした実行ファイルでは git repo にアクセスできないからです。

C++のための関連した質問があります。 ここで .



EDIT



mattanja さんのリクエストで、私がプロジェクトで使っている git hook スクリプトを掲載します。設定は

  • フックは linux のシェルスクリプトで、以下の場所に配置されています。 にあります。
  • を使用している場合は msysgit を使っている場合は フック フォルダには、すでにいくつかのサンプルスクリプトが含まれています。それらをgitから呼び出すには、スクリプト名から'.sample'拡張子を削除してください。
  • フックスクリプトの名前は、それらを呼び出すイベントと一致しています。私の場合は ポストコミット ポストマージ .
  • 私の AssemblyInfo.cs ファイルは、プロジェクトパスの直下にあります (同じレベルの .git フォルダと同じ階層)にあります。23行を含み、24行目を生成するためにgitを使用しています。

私のlinux-shellは少し錆びついているので、このスクリプトは単に AssemblyInfo.cs を一時ファイルに読み込み、最終行に git ハッシュをエコーして、ファイル名を変更して AssemblyInfo.cs . もっと良い方法があると思うのですが。

#!/bin/sh
cmt=$(git rev-list --max-count=1 HEAD)
head -23 AssemblyInfo.cs > AssemblyInfo.cs.tmp
echo [assembly: AssemblyFileVersion\(\"$cmt\"\)] >> AssemblyInfo.cs.tmp
mv AssemblyInfo.cs.tmp AssemblyInfo.cs

これが役立つといいのですが。

どのように解決するのですか?

gitのタグを使用してバージョンを追跡しています。

git tag -a v13.3.1 -m "version 13.3.1"

git経由でハッシュ付きバージョンを取得することができます。

git describe --long

私たちのビルドプロセスでは、AssemblyInfo.cs ファイルの AssemblyInformationalVersion 属性に git ハッシュを置きます。

[assembly: AssemblyInformationalVersion("13.3.1.74-g5224f3b")]

コンパイルしたら、Windowsエクスプローラからバージョンを確認することができます。

経由でプログラム的に取得することもできます。

var build = ((AssemblyInformationalVersionAttribute)Assembly
  .GetAssembly(typeof(YOURTYPE))
  .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false)[0])
  .InformationalVersion;

ここで、YOURTYPEはAssemblyInformationalVersion属性を持つアセンブリ内の任意のTypeです。