はじめに
NAntとはAnt(Javaのビルドツール)の.NET版ツールです。さまざまなタスクやファンクションが用意され、開発時の作業自動化や、作業の負荷軽減が可能になる便利なツールです(2006/10/11時点の最新バージョンは0.85rc4)。NAntに関する詳細は、別稿「NAntを活用して開発時の作業を自動化する」も併せて参照してください。
本稿ではこのNAntを利用して、ビルド作業のたびにアセンブリのファイルバージョンのアップデートを自動で行う方法を紹介します。これによって、手動によるビルドバージョン変更の手間がなくなり、ビルドが何度行われているかを正確に把握することができます。
バージョン保持ファイルに前回のバージョンを保存しておき、それをNAntで更新することによって、アセンブリのファイルバージョンの4桁目(例:1.0.0.0の0部分)を、ビルドのたびにインクリメントすることができます。バージョン保持ファイルの更新処理はNAntスクリプト中にC#で記述します。NAntスクリプト中にC#のソースを記述するためのサンプルとしても利用できます。
対象読者
Visual Studio.NETの開発者の方。コンパイル/ビルド作業、インストーラ作成作業の自動化に興味がある開発者の方。
必要な環境
このサンプルは、以下の環境で動作確認を行っています。
- NAnt バージョン0.85-rc4
- Visual Studio.NET 2003
- .NET Framework SDK 1.1
NAntは、「NAnt Home Page」よりダウンロードしてください。
solution
タスクがサポートされていないので注意してください。サンプルファイルの使用方法
サンプルファイル「NAntSample_VCSharp.zip」には以下のものが含まれています。
- NAnt本体(バージョン0.85-rc4)
- NAntソースファイル
- NAnt初期設定用バッチファイル
- NAnt起動用バッチファイル
- NAntサンプルスクリプト
サンプルファイルを使う前に、以下の作業を行ってください。
- ダウンロードファイルを「C:\」に解凍してください(配置先は「C:\NAntSample_VCSharp」)。
- 初回実行時、バージョン保持ファイル出力先ディレクトリを作成するために、「NAntInit.bat」をダブルクリックして実行してください。
- NAntを実行するため、「NAntExecute.bat」をダブルクリックしてください。NAntExecute.bat起動時に、NAnt.exeのパスが環境変数に設定されます。
サンプルスクリプトの概要
サンプルスクリプトの処理の流れを、下図で把握しておきましょう。
サンプルスクリプトは、5つの「設定」および「ターゲット」で構成されています。
- プロジェクト設定・プロパティ設定
main
ターゲットargs
ターゲットupdateversion
ターゲットgenasminfo
ターゲット
これらの「設定」および「ターゲット」について、以下ひとつずつ解説していきます。
1. プロジェクト設定・プロパティ設定
ここでは、スクリプト内で利用する値をプロパティとして設定しておきます。何度も利用する値などを、まとめて設定しておくと便利です。
<!-- プロジェクト --> <project name="Project1" default="main"> <!-- プロパティ設定 --> <!-- プロジェクト名 --> <property name="project.name" value="Project1" /> <!-- ソースの配置先 --> <property name="project.src" value="C:\NAntSample_VCSharp" /> <!-- ビルド出力先 --> <property name="build.dir" value="${project.src}\Build" /> <!-- バージョン保持ファイル設定 --> <property name="version.file" value="${build.dir}\Version\${project.name}" />
各プロパティの意味は、次のとおりです。
プロパティ | 意味 |
project.name プロパティ | このプロジェクトの名前。ここでは「Project1」という名前に設定。 |
project.src プロパティ | ソース配置先のディレクトリ。ここでのディレクトリの構成は下図「ソース配置先のディレクトリ構成」のとおり。 |
build.dir プロパティ | ビルドの出力先。今回は「C:\NAntSample_VCSharp\Build」に設定。 |
version.file プロパティ | バージョン保持ファイルの保存先。今回は「C:\NAntSample_VCSharp\Build\Version」に「Project1」という名前のバージョン保持ファイルが作成される。 |
今回は、サンプルファイルを解凍すると、project.src
プロパティで指定した場所にソースが配置されています。
mainターゲット - メイン処理
main
ターゲットは、ビルドのメイン処理を行うターゲットです。まず、main
ターゲットに依存しているargs
ターゲットが実行されます。これにより、product.ver
プロパティとsolution.long.ver
プロパティに値が設定されます。
次に、version.file
が存在する場合にupdateversion
ターゲットが実行されます。バージョン保持ファイルが作成または更新されます。バージョン保持ファイル内の値を基に、「AssemblyInfo.cs」ファイルにアセンブリの属性値が設定されます。
その後、「AssemblyInfo.cs」ファイルの情報を基に、solution
タスクを利用してビルドを行います。
<target name="main" depends="args" > <!-- バージョン保持ファイルが存在する場合、 updateversion ターゲットを呼ぶ --> <call target="updateversion" if="${property::exists('version.file')}" /> <!-- build.versionが存在する場合、AssemblyInfoファイルを指定し、 genasminfoターゲットを呼ぶ --> <if test="${property::exists('build.version')}" > <!-- 対象とするアセンブリファイルを指定。 --> <property name="asm.file" value="${project.src} \${project.name}\Product\AssemblyInfo.cs" /> <!-- 「genasminfo」ターゲットを実行。 --> <call target="genasminfo" /> <property name="asm.file" value="${project.src} \${project.name}\ProductLib\AssemblyInfo.cs" /> <call target="genasminfo" /> </if> <!-- ソリューションタスクで、ビルド対象となるVSの プロジェクト(~.csproj)を指定し、ビルドを実行 --> <solution configuration="release" includevsfolders="false" outputdir="${build.dir}\${project.name}\Assemblies" > <projects> <include name="${project.src}\${project.name} \Product\Product.csproj" /> <include name="${project.src}\${project.name} \ProductLib\ProductLib.csproj" /> </projects> </solution> </target>
ここで使用されているNAntのタスクとファンクションは以下の4つです。
if
タスクcall
タスクproperty::exists
ファンクションsolution
タスク
これらについて、以下に記します。
ifタスク
if
タスクは、ターゲットやプロパティが存在するか、プロパティ値の判定を行います。
属性名 | 型 | 説明 | 必須 |
test | string | test プロパティ値を判定するのに利用される。 | × |
failonerror | bool | タスク実行中にエラーが発生した場合、ビルドプロセスを中止させるかどうかを設定。デフォルト値はtrue。 | × |
if | bool | 値がtrueならば、タスクは実行される。falseならば、タスクはスキップされる。 デフォルト値はtrue。 | × |
unless | bool | if 属性の逆。値がfalseならば、タスクは実行される。trueならば、タスクはスキップされる。 デフォルト値はfalse。 | × |
verbose | bool | 詳細なログを出力するかどうかを設定。 デフォルト値はfalse。 | × |
通常、test
属性とfailonerror
属性を指定することが多いです。
callタスク
call
タスクは、スクリプト内のターゲットを呼び出し、実行するタスクです。
属性名 | 型 | 説明 | 必須 |
target | string | 呼び出したいターゲットの名前。 | ○ |
cascade | bool | 指定されたターゲットについて、既にそのターゲットが実行済であっても実行するかどうかを設定。 デフォルト値はtrue。 | × |
failonerror | bool | タスク実行中にエラーが発生した場合、ビルドプロセスを中止させるかどうかを設定。 デフォルト値はtrue。 | × |
if | bool | 値がtrueならば、タスクは実行される。falseならば、タスクはスキップされる。 デフォルト値はtrue。 | × |
unless | bool | if 属性の逆。値がfalseならば、タスクは実行される。trueならば、タスクはスキップされる。 デフォルト値はfalse。 | × |
verbose | bool | 詳細なログを出力するかどうかを設定。 デフォルト値はfalse。 | × |
通常、target
属性だけを指定することが多いです。
property::exists ファンクション
property::exists
ファンクションは、プロパティが存在するかを判定するために使用します。
bool property::exists(name)
属性名 | 型 | 説明 |
name | string | プロパティ名 |
条件 | 戻り値 |
引数で指定したプロパティが存在している場合。 | true |
引数で指定したプロパティが存在しない場合。 | false |
solutionタスク
solution
タスクは、Visual Studio(Visual Basic .NET、Visual C# .NET、Visual J# .NET、Visual C++ .NET)のソリューションおよびプロジェクトをコンパイルします。
属性名 | 型 | 説明 | 必須 |
configuration | string | デバッグモード(pdbファイルも一緒に出力)でビルドする場合は、「debug」を指定。リリースモードでビルドする場合は、「release」を指定。 | ○ |
includevsfolders | bool | Visual Studio.NETで設定している参照のパスなどを有効にするかどうか。 デフォルト値はtrue。 | × |
outputdir | directory | ソリューションおよびプロジェクトをコンパイルした際の、ファイルの出力先。 | × |
solutionfile | file | Visual Studio.NETのソリューションファイル(slnファイル)を設定。 | × |
failonerror | bool | タスク実行中にエラーが発生した場合、ビルドプロセスを中止させるかどうかを設定。デフォルト値はtrue。 | × |
if | bool | 値がtrueならば、タスクは実行される。falseならば、タスクはスキップされる。 デフォルト値はtrue。 | × |
unless | bool | if 属性の逆。値がfalseならば、タスクは実行される。trueならば、タスクはスキップされる。 デフォルト値はfalse。 | × |
verbose | bool | 詳細なログを出力するかどうかを設定。 デフォルト値はfalse。 | × |
<assemblyfolders>~</assemblyfolders>タグについて
includevsfolders
属性の値がfalseの場合、Visual Studio.NETで設定している参照設定のパスは無効になります。この場合、参照設定のパスをassemblyfolders
を用いて指定します。
<assemblyfolders> <include name="${build.dir}\Assemblies" /> <include name="C:\WINDOWS" /> </assemblyfolders>