TortoiseSVNで管理しているバージョン番号を、ソフトウェアに対して自動で設定する方法について解説します。
TortoiseSVNに付属しているSubWCRevというツールを使用します。これは作業コピーの状態を読み取り、テキストファイルのキーワードを置換する機能を持ちます。
キーワード | 説明 |
---|---|
$WCREV$ | 最新のリビジョン番号 |
$WCDATE$ | 最新のリビジョンのコミット日時 |
$WCNOW$ | 現在のシステム日時 (ビルド日時として利用できる) |
$WCRANGE$ | 作業コピーに含まれる、最古と最新のリビジョン番号 |
アセンブリ情報ファイル (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バージョンのリソースに保存される。 |
バージョン番号を定義するためのファイルを作成します。そしてこのファイルに対して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 ENDVisual C++ でビルドのたびにバージョン情報をインクリメントする方法
Visual StudioのプロジェクトのビルドイベントでSubWCRevを実行することで、バージョン番号を自動で設定できます。構文は、
SubWCRev WorkingCopyPath [SrcVersionFile DstVersionFile] [-nmdfe]
のようになります。たとえばVisual Studioのマクロを使用するならば、
"%ProgramFiles%/TortoiseSVN/bin/SubWCRev" $(SolutionDir) $(ProjectDir)Properties/AssemblyInfoTemplate.txt $(ProjectDir)Properties/AssemblyInfo.cs
のように指定します。これをビルド前のイベントに記述します。
プロジェクトのプロパティを開き、[ビルド イベント]の[ビルド前に実行するコマンド ライン]に記述します。
プロジェクトのプロパティを開き、[構成プロパティ] → [ビルド イベント] → [ビルド前のイベント]の[コマンド ライン]に記述します。
下図のようなバージョン番号の表記を設定する方法について解説します。
これを応用すれば、バージョン情報ダイアログにも同様に設定できます。
アセンブリ情報ファイルに格納した情報は、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) |
振る舞いを変更せずに、修正が行われたことを意味する。 |
メジャー.マイナ.ビルド.リビジョン