ビルド前イベントを活用する、その9
ビルド前イベントで Git のコマンドを使ってみましょう。下記の記事の発展形です。
Git のコマンドで、
・ハッシュ値
・短いハッシュ値
・アクティブブランチ
・コミットログ
を取得する場合は下記のコマンドを実行します。
git rev-parse HEAD
git rev-parse --short HEAD
git symbolic-ref --short HEAD
git log
ビルド前イベントに、これらのコマンドを実行してアプリケーションに Git のハッシュ値や、ブランチ名を埋め込みましょう。バージョン管理に役立ちます。
下記が動的に生成するC#のソースコードで GitInfo.cs です。このファイルはあらかじめ適当な文字列を入れてプロジェクトに追加しておいてください。ビルド前イベントが動いたらここに適正な文字列が仕込まれます。
namespace aaa
{
public static class GitInfo
{
public const string HASH = "f0caf986582fc2c7d457df9759bab99f298042b6";
public const string HASH_N7 = "f0caf98";
public const string BRANCH = "master";
}
}
下記がビルド前イベントの実行スクリプトです。Git のログは、exe が出来上がるディレクトリに git_hash_branch_log.txt というファイル名で出来上がります。exe が出来上がるディレクトリを示す文字列は VisualStudio のマクロ変数で $(TargetDir) を使って取得します。
echo プリビルドスクリプトを開始します.
@echo off
setlocal enabledelayedexpansion
REM git のハッシュ、短いハッシュ、アクティブブランチを取得する.
for /f %%A in ('git rev-parse HEAD') do set GIT_HASH=%%A
for /f %%B in ('git rev-parse --short HEAD') do set GIT_HASH_N7=%%B
for /f %%C in ('git symbolic-ref --short HEAD') do set GIT_BRANCH=%%C
(
echo namespace $(RootNamespace)
echo {
echo public static class GitInfo
echo {
echo public const string HASH = "!GIT_HASH!";
echo public const string HASH_N7 = "!GIT_HASH_N7!";
echo public const string BRANCH = "!GIT_BRANCH!";
echo }
echo }
) > "$(ProjectDir)GitInfo.cs"
(
echo !GIT_HASH!
echo !GIT_BRANCH!
echo.
) > "$(TargetDir)git_hash_branch_log.txt"
REM gitログを追記する.
git log >> "$(TargetDir)git_hash_branch_log.txt"
endlocal
echo プリビルドスクリプトが完了しました.
下記のコードは、Form1 の起動時に、Gitの情報をメッセージボックスに表示します。また、ウインドウが開いたらタイトルバーに短いハッシュと、アクティブブランチが表示されています。
using System;
using System.Text;
using System.Windows.Forms;
namespace aaa
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load( object sender, EventArgs e )
{
// タイトルバーにGit情報を表示する.
String s0 = GitInfo.HASH;
String s1 = GitInfo.HASH_N7;
String s2 = GitInfo.BRANCH;
this.Text = $"({s1}) ({s2})";
// メッセージボックスでGit情報を表示する.
StringBuilder sb = new StringBuilder();
sb.AppendLine( s0 );
sb.AppendLine( s1 );
sb.AppendLine( s2 );
MessageBox.Show( sb.ToString().Trim() );
}
}
}