Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

NAntでアセンブリのバージョンアップデートを自動化する

NAntスクリプトによるビルド効率化TIPS

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/10/18 00:00

本稿では、.NET用のビルドツールNAntを利用する際に、アセンブリのファイルバージョンのアップデートを自動で行う方法を紹介します。これにより、手動によるビルドバージョン変更の手間がなくなり、ビルドが何度行われているかを正確に把握することができます。

目次

はじめに

 NAntとはAnt(Javaのビルドツール)の.NET版ツールです。さまざまなタスクやファンクションが用意され、開発時の作業自動化や、作業の負荷軽減が可能になる便利なツールです(2006/10/11時点の最新バージョンは0.85rc4)。NAntに関する詳細は、別稿「NAntを活用して開発時の作業を自動化する」も併せて参照してください。

 本稿ではこのNAntを利用して、ビルド作業のたびにアセンブリのファイルバージョンのアップデートを自動で行う方法を紹介します。これによって、手動によるビルドバージョン変更の手間がなくなり、ビルドが何度行われているかを正確に把握することができます。

 バージョン保持ファイルに前回のバージョンを保存しておき、それをNAntで更新することによって、アセンブリのファイルバージョンの4桁目(例:1.0.0.00部分)を、ビルドのたびにインクリメントすることができます。バージョン保持ファイルの更新処理は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タスクのサポートについて
 NAntバージョン0.85-rc4では、Visual Studio 2005(.NET 2.0)で作成されたソリューションおよびプロジェクトについて、solutionタスクがサポートされていないので注意してください。

サンプルファイルの使用方法

 サンプルファイル「NAntSample_VCSharp.zip」には以下のものが含まれています。

  • NAnt本体(バージョン0.85-rc4)
  • NAntソースファイル
  • NAnt初期設定用バッチファイル
  • NAnt起動用バッチファイル
  • NAntサンプルスクリプト

 サンプルファイルを使う前に、以下の作業を行ってください。

  1. ダウンロードファイルを「C:\」に解凍してください(配置先は「C:\NAntSample_VCSharp」)。
  2. 初回実行時、バージョン保持ファイル出力先ディレクトリを作成するために、「NAntInit.bat」をダブルクリックして実行してください。
  3. NAntを実行するため、「NAntExecute.bat」をダブルクリックしてください。NAntExecute.bat起動時に、NAnt.exeのパスが環境変数に設定されます。

サンプルスクリプトの概要

 サンプルスクリプトの処理の流れを、下図で把握しておきましょう。

サンプルスクリプト 処理の流れ
サンプルスクリプト 処理の流れ

 サンプルスクリプトは、5つの「設定」および「ターゲット」で構成されています。

  1. プロジェクト設定・プロパティ設定
  2. mainターゲット
  3. argsターゲット
  4. updateversionターゲット
  5. genasminfoターゲット

 これらの「設定」および「ターゲット」について、以下ひとつずつ解説していきます。

1. プロジェクト設定・プロパティ設定

 ここでは、スクリプト内で利用する値をプロパティとして設定しておきます。何度も利用する値などを、まとめて設定しておくと便利です。

nant.build内のプロパティ設定部分
<!-- プロジェクト -->
<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プロパティで指定した場所にソースが配置されています。

ソースの自動取得
 通常のビルド作業時には、VSS(Visual Source Safe)などからソースを自動で取得するのが便利です。NAntContribのVSS関連タスクCruiseControl.NETDraco.NETを利用し、ソースを自動取得するのがよいでしょう。

mainターゲット - メイン処理

 mainターゲットは、ビルドのメイン処理を行うターゲットです。まず、mainターゲットに依存しているargsターゲットが実行されます。これにより、product.verプロパティとsolution.long.verプロパティに値が設定されます。

 次に、version.fileが存在する場合にupdateversionターゲットが実行されます。バージョン保持ファイルが作成または更新されます。バージョン保持ファイル内の値を基に、「AssemblyInfo.cs」ファイルにアセンブリの属性値が設定されます。

 その後、「AssemblyInfo.cs」ファイルの情報を基に、solutionタスクを利用してビルドを行います。

nant.build内のmainターゲット
<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タスクは、ターゲットやプロパティが存在するか、プロパティ値の判定を行います。

ifタスクの属性
属性名説明必須
teststringtestプロパティ値を判定するのに利用される。×
failonerrorboolタスク実行中にエラーが発生した場合、ビルドプロセスを中止させるかどうかを設定。デフォルト値はtrue。×
ifbool値がtrueならば、タスクは実行される。falseならば、タスクはスキップされる。 デフォルト値はtrue。×
unlessboolif属性の逆。値がfalseならば、タスクは実行される。trueならば、タスクはスキップされる。 デフォルト値はfalse。×
verbosebool詳細なログを出力するかどうかを設定。 デフォルト値はfalse。×

 通常、test属性とfailonerror属性を指定することが多いです。

callタスク

 callタスクは、スクリプト内のターゲットを呼び出し、実行するタスクです。

callタスクの属性
属性名説明必須
targetstring呼び出したいターゲットの名前。
cascadebool指定されたターゲットについて、既にそのターゲットが実行済であっても実行するかどうかを設定。 デフォルト値はtrue。×
failonerrorboolタスク実行中にエラーが発生した場合、ビルドプロセスを中止させるかどうかを設定。 デフォルト値はtrue。×
ifbool値がtrueならば、タスクは実行される。falseならば、タスクはスキップされる。 デフォルト値はtrue。×
unlessboolif属性の逆。値がfalseならば、タスクは実行される。trueならば、タスクはスキップされる。 デフォルト値はfalse。×
verbosebool詳細なログを出力するかどうかを設定。 デフォルト値はfalse。×

 通常、target属性だけを指定することが多いです。

property::exists ファンクション

 property::existsファンクションは、プロパティが存在するかを判定するために使用します。

使い方
bool property::exists(name)
property::existsファンクションの属性
属性名説明
namestringプロパティ名
戻り値
条件戻り値
引数で指定したプロパティが存在している場合。true
引数で指定したプロパティが存在しない場合。false

solutionタスク

 solutionタスクは、Visual Studio(Visual Basic .NET、Visual C# .NET、Visual J# .NET、Visual C++ .NET)のソリューションおよびプロジェクトをコンパイルします。

solutionタスクの属性
属性名説明必須
configurationstringデバッグモード(pdbファイルも一緒に出力)でビルドする場合は、「debug」を指定。リリースモードでビルドする場合は、「release」を指定。
includevsfoldersboolVisual Studio.NETで設定している参照のパスなどを有効にするかどうか。 デフォルト値はtrue。×
outputdirdirectoryソリューションおよびプロジェクトをコンパイルした際の、ファイルの出力先。×
solutionfilefileVisual Studio.NETのソリューションファイル(slnファイル)を設定。×
failonerrorboolタスク実行中にエラーが発生した場合、ビルドプロセスを中止させるかどうかを設定。デフォルト値はtrue。×
ifbool値がtrueならば、タスクは実行される。falseならば、タスクはスキップされる。 デフォルト値はtrue。×
unlessboolif属性の逆。値がfalseならば、タスクは実行される。trueならば、タスクはスキップされる。 デフォルト値はfalse。×
verbosebool詳細なログを出力するかどうかを設定。 デフォルト値はfalse。×
solutionタスクのサポート状況
 Visual Studio2005、および.NET 2.0に対しては、solutionタスクがサポートされていません。

<assemblyfolders>~</assemblyfolders>タグについて

 includevsfolders属性の値がfalseの場合、Visual Studio.NETで設定している参照設定のパスは無効になります。この場合、参照設定のパスをassemblyfoldersを用いて指定します。

タグの使用例
<assemblyfolders>
    <include name="${build.dir}\Assemblies" />
    <include name="C:\WINDOWS" />
</assemblyfolders>

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 齋藤 利佳(サイトウ リカ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:NAntスクリプトによるビルド効率化TIPS
All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5