SubWCRevによるバージョン番号の自動設定

TortoiseSVNで管理しているバージョン番号を、ソフトウェアに対して自動で設定する方法について解説します。

アセンブリ情報 / リソースファイルへのバージョン番号の埋込み

TortoiseSVNに付属しているSubWCRevというツールを使用します。これは作業コピーの状態を読み取り、テキストファイルのキーワードを置換する機能を持ちます。

キーワード置換に使用できるキーワード (一部)
キーワード 説明
$WCREV$ 最新のリビジョン番号
$WCDATE$ 最新のリビジョンのコミット日時
$WCNOW$ 現在のシステム日時 (ビルド日時として利用できる)
$WCRANGE$ 作業コピーに含まれる、最古と最新のリビジョン番号
SubWCRev プログラム - TortoiseSVNマニュアル

C#の場合

アセンブリ情報ファイル (AssemblyInfo.cs) を元に、置換するキーワードを埋め込んだテンプレートとなるファイルを作成します。そしてSubWCRevでそれのキーワードを置換して、実際のアセンブリ情報ファイルに上書きします。たとえばそれは、

// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
[assembly: AssemblyVersion( "1.0.0.$WCREV$" )]

のようになります。キーワード$WCREV$の部分が、作業コピーのリビジョン番号に置換されることになります。

バージョン番号の種類

アセンブリのバージョン番号には3種類ありますが、下表に示すようにC#ではAssemblyVersionを設定するだけです。

バージョン番号の種類による相違点
バージョン番号 説明
AssemblyVersion CLRによってアセンブリを一意に識別するために用いられる。
AssemblyFileVersion CLRには無効。Win32バージョンのリソースに保存される。
AssemblyInformationalVersion CLRには無効。Win32バージョンのリソースに保存される。

Visual C++の場合

バージョン番号を定義するためのファイルを作成します。そしてこのファイルに対してSubWCRevでキーワードを置換して、たとえばversion.hというファイルを作成します。

#define FILE_VERSION        1, 0, 0, $WCREV$
#define PRODUCT_VERSION     1, 0, 0, $WCREV$

#define STR_FILE_VERSION    "1, 0, 0, $WCREV$"
#define STR_PRODUCT_VERSION "1, 0, 0, $WCREV$"

リソースファイル (.rc) で、このファイルをincludeします。そしてバージョン番号を定義している箇所に先に定義した定数を記述することで、ここに作業コピーのリビジョン番号が反映されます。

/////////////////////////////////////////////////////////////////////////////
//
// Version
//

#include "version.h"

VS_VERSION_INFO VERSIONINFO
 FILEVERSION    FILE_VERSION
 PRODUCTVERSION PRODUCT_VERSION
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "041104b0"
        BEGIN
            VALUE "FileVersion",    STR_FILE_VERSION
            VALUE "ProductVersion", STR_PRODUCT_VERSION
        END
    END
END
Visual C++ でビルドのたびにバージョン情報をインクリメントする方法

SubWCRevによるキーワード置換の自動実行

Visual StudioのプロジェクトのビルドイベントでSubWCRevを実行することで、バージョン番号を自動で設定できます。構文は、

SubWCRev WorkingCopyPath [SrcVersionFile DstVersionFile] [-nmdfe]

のようになります。たとえばVisual Studioのマクロを使用するならば、

"%ProgramFiles%/TortoiseSVN/bin/SubWCRev" $(SolutionDir)
  $(ProjectDir)Properties/AssemblyInfoTemplate.txt
  $(ProjectDir)Properties/AssemblyInfo.cs

のように指定します。これをビルド前のイベントに記述します。

C#の場合

プロジェクトのプロパティを開き、[ビルド イベント]の[ビルド前に実行するコマンド ライン]に記述します。

Visual C++の場合

プロジェクトのプロパティを開き、[構成プロパティ] → [ビルド イベント] → [ビルド前のイベント]の[コマンド ライン]に記述します。

フォームのタイトルへのバージョン番号の設定

下図のようなバージョン番号の表記を設定する方法について解説します。

これを応用すれば、バージョン情報ダイアログにも同様に設定できます。

C#の場合

アセンブリ情報ファイルに格納した情報は、Assemblyクラスから取得できます。ここにバージョン番号が含まれています。

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();

System.Reflection.AssemblyName assemblyName = assembly.GetName(); // アセンブリ名
System.Version version = assemblyName.Version;                    // バージョン番号

// フォームのタイトルを設定する
this.Text = string.Format(
    "{0} {1}.{2}.{3}",
    assemblyName.Name,
    version.Major,
    version.Minor,
    version.Revision
    );

補足:バージョン番号の解説

メジャー、マイナ、ビルドそれにリビジョンの、各バージョン番号の採番の規則を下表に示します。ただしこれは一例にすぎず、その他の規則はAssemblyVersionAttribute コンストラクタにあります。

バージョン バージョン番号の変更の意味
メジャー
(Major)
下位互換性を保証せず、大幅な修正が行われたことを意味する。
マイナ
(Minor)
下位互換性を保ちつつ、大幅な修正が行われたことを意味する。
ビルド
(Build)
同一ソースが、再コンパイルされたことを意味する。
リビジョン
(Revision)
振る舞いを変更せずに、修正が行われたことを意味する。
Version クラス | MSDN
メジャー.マイナ.ビルド.リビジョン
複数の技術系サイトから、まとめて検索