ビルドファイル作成とNAntの実行手順
NAntの魅力について理解していただけたところで、NAntで必要な設定について紹介します。NAntを実行するには、一般的に次の手順が必要になります。
- ビルドファイルの作成
- ビルドファイルの記述
- プロジェクトの設定(ビルドファイルの基本定義の設定)
- プロパティの設定(使用する変数の設定)
- ターゲットの設定(NAntから呼び出す機能単位の設定)
- NAntの実行
本稿では、Windowsアプリケーションプロジェクトをコンパイルして、アプリケーションを実行するという簡単なシナリオをNAntで実行してみます。
ビルドファイルの作成
作業内容を記述するビルドファイルはXMLファイルのため、Visual Studioの[新しい項目の追加]ウィンドウで[XMLファイル]を選択して作成します。ビルドファイルの名前は自由に付けてかまいませんが、「default.build」という名前をつけるのが慣例です。
ビルドファイルの1行目には<?xml version="1.0" encoding="utf-8" ?>
というXMLの宣言が書かれていますので、そのまま残しておきます。
ビルドファイルの記述
それでは、ビルドファイルを書いていきます。NAntでは「プロジェクト」「プロパティ」「ターゲット」といった独自の用語を理解する必要があります。ビルドファイルの大まかな構成は下図のようになります。
「プロジェクト」には、ビルドファイルの全体的な設定(ビルド時に基準となるディレクトリなど)を記述します。
「プロパティ」には、ビルドファイルで使用する変数を設定します。変数を利用することによって、設定の変更を局所化できるメリットがあります。
「ターゲット」には、自動化したい作業内容を記述します。ターゲットには、先ほど説明した「タスク」をどのように使うかを設定します。ターゲットはクラスで言うところのメソッドのようなものと理解して良いでしょう。
なお、NAntは、JavaのAntを.NET環境に移植したため、「プロジェクト」と「プロパティ」といった用語がVisual Studioの用語(.NETの用語)と重複してしまいますが、本稿では、NAntの用語として説明していますので混同しないように注意してください。
1.プロジェクト(ビルドファイルの基本定義)の記述
ビルドファイルのルートには、プロジェクト(<project>
要素)を設定します。<project>
要素には次の属性を設定できます。
属性名 | 説明 | 必須 |
name | NAntプロジェクトの名前 | × |
default | デフォルトのターゲット | × |
basedir | ファイルの場所を決定するときに用いるベースディレクトリ | × |
ここでは、
<project name="NAntSample" default="build" basedir="."> (中略) </project>
のように、ビルドファイルの目的をあらわす「プロジェクト名」にNAntSample
を、実行するターゲット名を指定しないときに動作する「デフォルトターゲット」にbuild
を、ビルド時の基準ディレクトリとなる「ベースディレクトリ」にピリオド
(ビルドファイルと同じ場所)を設定しました。
2.プロパティ(使用する変数)の記述
続けてプロパティ(<property>
要素)を設定します。プロパティはビルドファイル内で使える変数で、文字列の値を持ちます。<property>
要素には次の属性を設定できます。
属性名 | 説明 | 必須 |
name | プロパティの名前(ピリオドで区切った名前がよく利用される) | ○ |
value | プロパティの値 | ○ |
overwrite | 値が設定済みの場合、値を上書きするか(初期値はtrue) | × |
readonly | 定数のような読み取り専用のプロパティにするか(初期値はfalse) | × |
failonerror | プロパティの設定に失敗したときエラーとして処理を中断するか(初期値はtrue) | × |
if | trueの場合のみプロパティを設定(unlessの逆) | × |
unless | falseの場合のみプロパティを設定(ifの逆) | × |
まずは、よく利用される<property name="プロパティ名" value="プロパティ値"/>
というパターンを覚えておけば良いでしょう。ここでは、
<property name="basename" value="NAntSampleVB2003"/>
とbasenameという名前のプロパティを宣言し、値に"NAntSampleVB2003"を代入しています。このプロパティは、後ほどソリューションファイル名と実行ファイル名として利用されます。利用するときには、${basename}
というように「${プロパティ名}」と記述することで値を取得できます。
なお、プロパティはビルドファイルの最初で宣言することが一般的ですが、任意の場所で宣言/代入することができます(ターゲットの中で宣言した場合は、そのプロパティのスコープはターゲットの中だけになります)。
プロパティを利用しなくても問題ありませんが、可読性と保守性が良くなるので、できるだけ利用するようにしましょう。
組み込みプロパティ
宣言しなくても利用できる「組み込みプロパティ」という特別なプロパティもあります。
名前 | 説明 |
nant.onsuccess | ビルドに成功したときに動作するターゲット名を指定しておくプロパティ |
nant.onfailure | ビルドに失敗したときに動作するターゲット名を指定しておくプロパティ |
nant.settings.currentframework | 現在動作している.NET Frameworkのバージョン |
NAntのページを見ると、多くの組み込みプロパティが存在しますが、ほとんどが推奨されていません(Deprecated、非推奨と書かれています)。そのため表の3つだけを知っておけば問題ないでしょう。
3.ターゲット(NAntから呼び出す機能単位)の記述
最後に、ターゲット(<target>
要素)を設定します。ターゲットとは、NAntから呼び出せる最小の作業単位のことで、自動化する内容を記述します。ビルドファイルには、必ず1つ以上のターゲットを設定する必要があります。<target>
要素には、次の属性を設定できます。<target>
要素の属性はどれもよく利用するので、しっかりと覚えておくとビルドファイルを効率的に編集できるようになるでしょう。
属性名 | 説明 | 必須 |
name | ターゲットの名前 | ○ |
depends | 依存するターゲット名(複数時はカンマ区切り) | × |
if | 指定したプロパティが存在する場合のみターゲットをビルド(unlessの逆) | × |
unless | 指定したプロパティが存在しない場合のみターゲットをビルド(ifの逆) | × |
description | ターゲットの説明 | × |
ここでは、コンパイルを行う「build」ターゲットとアプリケーションの実行を行う「run」ターゲットを作成します。
buildターゲットの記述
コンパイルをする「build」ターゲットを次のように記述します。
<!-- buildターゲット --> <target name="build" description="Visual Studioソリューションのビルド"> <solution configuration="Debug" solutionfile="${basename}.sln" /> </target>
<solution>タスクの設定
ターゲットでは、自動化したいタスクの設定を行います。ここでは<solution>
タスクの設定を定義しています。利用できる属性はタスクによって異なりますが、<solution>
タスクでは次のような属性を主に設定できます。
属性名 | 説明 | 必須 |
configuration | ビルドするソリューション構成の名前 | ○ |
solutionfile | ビルドするソリューションファイルの名前 | × |
outputdir | コンパイル後のファイルを配置するディレクトリ | × |
ここでは、<solution configuration="Debug" solutionfile="${basename}.sln" />
と記述し、「NAntSampleVB2003.sln」というソリューションファイルの設定にそってDebug構成でビルドする「build」ターゲットを作成しました(なお、どのバージョンの.NET Frameworkでビルドするかは、「NAnt.exe」の実行時に-tオプションで指定します)。
runターゲットの記述
さらに、アプリケーションを実行する「run」というターゲットを設定します。runターゲットでは、<exce>
タスクと<echo>
タスクを利用します。そして、runターゲットには下図のような依存関係を設定します。依存関係とは、「アプリケーションを起動する前にビルドする」というような実行順序のルールのことです。
NAntでは、ターゲットのdepends
属性によって依存関係を設定することができます。このサンプルでは、runターゲットにdepends="build"
と設定しているため、runターゲットを実行する前に、buildターゲットが実行されるようになります(depends
属性は、カンマ区切りで複数指定することもできます)。
<!-- runターゲット --> <target name="run" depends="build" description="アプリケーションの実行"> <exec program="${basename}.exe" basedir="bin" /> <echo message="${datetime::now()}に実行しました。" /> </target>
<exec>タスクの設定
そして、runターゲットでは、<exec>
タスクで、ビルドしたアプリケーションを起動するように設定しています。ここでは、「bin」フォルダの「NAntSampleVB2003.exe」を実行します。
属性名 | 説明 | 必須 |
program | 実行するプログラム | ○ |
basedir | プログラムのあるディレクトリ | × |
<echo>タスクの設定
1つのターゲットに複数のタスクを記述することができます。複数のタスクを書いた場合には上から順に実行されます。
ここでは、<exec>
タスクでプログラムを実行した後に、<echo>
タスクで完了メッセージを出力しています。
属性名 | 説明 | 必須 |
message | 出力するメッセージ | × |
file | メッセージを出力するファイル | × |
関数の利用
なお、現在時刻を取得する${datetime::now()}
は関数とよばれる機能です。関数を利用すると、アセンブリや環境に関する情報などを取得することができます。主な関数は下表の通りです。
関数名 | 説明 |
assemblyname::get-assembly-name() |
ファイルからアセンブリ名の取得 |
assemblyname::get-codebase() |
アセンブリの場所の取得 |
directory::exists() |
指定のディレクトリが存在するか |
environment::get-folder-path() |
デスクトップなどの特定のシステムフォルダの取得 |
environment::get-user-name() |
ユーザー名の取得 |
environment::get-variable() |
指定の環境変数の取得 |
environment::get-operating-system() |
OSの取得 |
environment::get-machine-name() |
PC名の取得 |
file::exists() |
指定のファイルが存在するか |
framework::get-target-framework() |
現在の動作している.NET Framework名とバージョンの取得 |
nant::get-base-directory() |
NAnt.exeの存在するディレクトリの取得 |
path::get-full-path() |
ディレクトリとファイル名のフルパスの取得 |
path::get-directory-name() |
ディレクトリ名の取得 |
path::get-file-name() |
ファイル名の取得 |
property::exists() |
指定のプロパティが存在するか |
project::get-name() |
ビルドファイルのプロジェクト名の取得 |
long::parse() |
文字列型を数値型へ変換 |
long::to-string() |
数値型を文字列型へ変換 |
datetime::parse() |
文字列型を日付型へ変換 |
datetime::to-string() |
日付型を文字列型へ変換 |
関数の詳細についてはNAntの関数リファレンスをご覧ください。