2. argsターゲット - コマンドからNAntに値を渡す
NAntでは、スクリプトの実行時に「-D:」オプションを使って、NAntに値を渡すことができます。ここでは、NAnt実行時に以下のように、3桁の数字を渡し、それを元にアセンブリのバージョンを生成しています。
-D:product.ver=110
「-D:product.ver」の値は、初回実行時以外でも常に渡す必要があります。
<target name="args" > <echo message="(project name): ${project.name}" /> <!-- 「product.ver」が-D:オプションで渡されたかどうか判定 --> <if test="${not property::exists('product.ver')}"> <!-- -D:オプションの使い方をコマンドプロンプトに表示する --> <echo message="(usage): nant -D:product.ver=### [target] " /> <!-- 「product.ver」が-D:オプションで渡されなかった場合は エラーメッセージを出力する --> <fail message="[error] product.ver missing or invalid." /> </if> <!-- NAntに渡された3桁のバージョンより、 アセンブリバージョンを生成 --> <!-- 例) "110" → "1.1.0.0" --> <property name="solution.long.ver" value="${string::substring(product.ver, 0, 1)}.${string::substring(product.ver, 1, 1)}.
${string::substring(product.ver, 2, 1)}.0" /> <echo message="solution.long.ver = ${solution.long.ver}" /> </target>
ここで使用されているNAntのタスクとファンクションは以下の4つです。
string::substringファンクションproperty::existsファンクションechoタスクfailタスク
これらの使い方について、以下に記します。
string::substring ファンクション
string::substringファンクションは、文字列の切り出しを行います。
string string::substring(str, startIndex, length)
| 属性名 | 型 | 説明 |
str | string | 文字列 |
startIndex | int | 切り出す文字列の開始位置。 |
length | int | 切り出す文字列の長さ。 |
| 条件 | 戻り値 |
| 文字列の長さが0以上の場合 | 元の文字列のstartIndexの位置からlength分の文字数だけを切り出し、新しい文字列として返す。 |
| 文字列の長さが0の場合 | 空の文字列を返す。 |
echoタスク
echoタスクは、コマンドプロンプトにメッセージを出力したり、ファイルにメッセージを出力します。
| 属性名 | 型 | 説明 | 必須 |
append | bool | 値がtrueの場合は、echoタスクでの出力を追記モードに設定。デフォルトは上書モード。 | × |
file | file | メッセージを書き出すファイルを指定。 | × |
level | Level | ログレベルを指定。デフォルト値はInfo。表「echoタスクのlevel属性で指定できる値」も参照のこと。 | × |
message | string | 出力したいメッセージを指定。 | ×(実質必須) |
failonerror | bool | タスク実行中にエラーが発生した場合、ビルドプロセスを中止させるかどうかを設定。デフォルト値はtrue。 | × |
if | bool | 値がtrueならば、タスクは実行される。falseならば、タスクはスキップされる。デフォルト値はtrue。 | × |
unless | bool | if属性の逆。値がfalseならば、タスクは実行される。trueならば、タスクはスキップされる。 デフォルト値はfalse。 | × |
verbose | bool | 詳細なログを出力するかどうかを設定。デフォルト値はfalse。 | × |
messege属性とflie属性は、よく利用されます。
level属性で指定できる値は次のとおりです。
| 値 | 説明 |
| Debug | ビルドプロセスのデバッグのための、より詳細な情報を出力。 |
| Error | エラーとなるイベントを出力。 |
| Info | ビルドプロセスのデバッグのための情報を出力。 |
| None | すべてのメッセージを出力しない。 |
| Verbose | 最も詳細な情報を出力。 |
| Warning | 警告レベルのイベントを出力。 |
failタスク
failタスクは、ビルド時に例外が発生し、ビルドが終了した際にメッセージを出力します。
| 属性名 | 型 | 説明 | 必須 |
message | string | 例外が発生した場合のために、エラーの原因などをこの属性に設定しておく。 | × |
failonerror | bool | タスク実行中にエラーが発生した場合、ビルドプロセスを中止させるかどうかを設定。デフォルト値はtrue。 | × |
if | bool | 値がtrueならば、タスクは実行される。falseならば、タスクはスキップされる。デフォルト値はtrue。 | × |
unless | bool | if属性の逆。値がfalseならば、タスクは実行される。trueならば、タスクはスキップされる。デフォルト値はfalse | × |
verbose | bool | 詳細なログを出力するかどうかを設定。デフォルト値はfalse。 | × |
3. updateversionターゲット - バージョン保持ファイル内のバージョンを更新する
このターゲットは、ビルド時に出力されるアセンブリのファイルバージョンを、ビルドするたびに1ずつインクリメントさせるためのものです。scriptタスクを利用し、C#で処理を記述していきます。updateversionターゲットの初回実行時には、バージョン保持ファイルを「C:\Build\Version」ディレクトリに「Project1」という名前で作成します。2回目以降は、作成された「Project1ファイル」内に記述されたバージョン番号(例:1.0.0.0)を読み取り、0の部分を1ずつインクリメントしていきます。ビルドするたびに、バージョン保持ファイル内のバージョン番号が更新されているのを確認してください。また、ビルド後出力されたアセンブリのファイルバージョンが更新されているのを、確認してください。
<target name="updateversion"> <!-- スクリプトタスク内に記述するコードの言語を指定 --> <script language="C#" > <code><![CDATA[ <!-- NAntのプロパティをscriptタスク内のコードで利用するため、 引数としてProjectを渡す --> public static void ScriptMain(Project p) { <!-- バージョン保持ファイルのパスを、NAntのversion.file プロパティから取得 --> string strFile = p.Properties[ "version.file" ]; string strVersion; StreamReader sr = null; try { <!-- バージョン保持ファイルから前バージョンを 取得し、strVersionに値を設定 --> sr = new StreamReader( strFile ); strVersion = sr.ReadLine(); } catch { <!-- 初回実行時はバージョン保持ファイルが存在しな いため、strVersionにsolution.long.verプロパティの 値を設定 --> strVersion = p.Properties[ "solution.long.ver" ]; } finally { if( sr != null ) sr.Close(); } <!-- strVersionの値を使用して、Versionクラスの新しい インスタンスを初期化 --> Version oldVersion = new Version(strVersion); <!-- メジャー番号、マイナー番号、ビルド番号、リビジョン 番号を指定して、Versionクラスの新しいインスタンスを 初期化 --> Version curVersion = new Version( oldVersion.Major, oldVersion.Minor, oldVersion.Build, oldVersion.Revision + 1 ); File.Delete( strFile ); <!-- バージョン保持ファイルに「前バージョン+1」の バージョンを記録 --> StreamWriter sw = new StreamWriter( strFile ); try { sw.WriteLine( curVersion.ToString() ); } finally { sw.Close(); } <!-- NAntのbuild.versionプロパティに、curVersionの値を 設定 --> p.Properties["build.version"] = curVersion.ToString(); } ]]></code> </script> <echo message="BUILD VERSION = ${build.version}" /> </target>
このコードの処理の流れは以下のとおりです。
- スクリプトタスク内に記述するコードの言語を指定します。
<code>~</code>タグでくくられた部分が、C#のコードとして認識されます。ScriptMainメソッドでは、NAntのプロパティをscriptタスク内のコードで利用するために、引数としてProject pを渡します。- バージョン保持ファイルのパスを、NAntの
version.fileプロパティから取得します。 - 初回実行時でバージョン保持ファイルが作成されていない場合は、
strVersionにsolution.long.verプロパティの値を設定します。 - バージョン保持ファイルが既に存在している場合は、バージョン保持ファイルから前のバージョンを取得し、
strVersionに値を設定します。 strVersion(前バージョン)の値を使用して、Versionクラスのインスタンスを初期化します。この値をoldVersionに設定します。- 前バージョン+1の値を、以下の形式で指定して、
Versionクラスのインスタンスを初期化します。この値を、curVersionに設定します。 - バージョン保持ファイルに、
curVersion(前バージョン+1の値)を書き込みます。 - NAntの
build.versionプロパティに、curVersionの値を設定します(後述するgenasminfoターゲット内で、solution.long.verプロパティとbuild.versionプロパティの値が利用されます)。
メジャー番号, マイナー番号, ビルド番号, リビジョン番号
このターゲットで使用されているNAntのタスクとファンクションは以下の2つです。
scriptタスクechoタスク
scriptタスクの使い方について、以下に記します。
scriptタスク
scriptタスクを用いると、NAntスクリプト中にC#やVB、J#のコードを記述することができます。NAntのタスクファンクションで処理できるものはそちらを利用し、できないものはC#などのコードで記述するとよいでしょう。また、scriptタスクを用いると、NAntにないカスタム関数を定義することも可能です。
| 属性名 | 型 | 説明 | 必須 |
language | string | スクリプトブロックで使用する言語を指定。指定可能な値は次のとおり。「VB」「vb」「VISUALBASIC」「C#」「c#」「CSHARP」「JS」「js」「JSCRIPT」「VJS」「vjs」「JSHARP」、もしくはCodeDomProviderを実装するクラスの完全修飾名。 | ○ |
mainclass | string | エントリポイントとなるクラスの名前(本稿の例題では、mainclass属性を指定していないため、staticなScriptMainメソッドがエントリポイントとなる)。 | × |
prefix | string | スクリプト内で定義されたカスタムファンクションのnamespaceプリフィクス。省略された場合は、デフォルトで「script」が指定される。 | × |
failonerror | bool | タスク実行中にエラーが発生した場合、ビルドプロセスを中止させるかどうかを設定。デフォルト値はtrue。 | × |
if | bool | 値がtrueならば、タスクは実行される。falseならば、タスクはスキップされる。デフォルト値はtrue。 | × |
unless | bool | if属性の逆。値がfalseならばタスクは実行される。trueならばタスクはスキップされる。デフォルト値はfalse。 | × |
verbose | bool | 詳細なログを出力するかどうかを設定。デフォルト値はfalse。 | × |
scriptタスク内のコードでは、デフォルトで以下のnamespacesがロードされます。
SystemSystem.CollectionsSystem.Collections.SpecializedSystem.IOSystem.TextSystem.Text.RegularExpressionsNAnt.Core
scriptタスク内で使用できる<code>~</code>タグは、1つだけです。CDATAセクションでくくられた中のコードは、プレーンなテキストとして扱われます。よって、「"」や「<」などに対して、実体参照や文字参照を使用する必要はありません。今回のサンプルのように、特にカスタム関数が定義されていない場合は、
staticなScriptMainメソッドがエントリポイントとなります。このScriptMainメソッドには、引数Projectのみを渡すことができます。Projectを引数で渡しているため、NAntスクリプト内で定義したプロパティなどを、scriptタスク内のコードで利用することが可能です。詳しくは、NAntの公式サイトのscriptタスクの説明を参照してください。

${string::substring(product.ver, 1, 1)}.