SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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


2. argsターゲット - コマンドからNAntに値を渡す

 NAntでは、スクリプトの実行時に「-D:」オプションを使って、NAntに値を渡すことができます。ここでは、NAnt実行時に以下のように、3桁の数字を渡し、それを元にアセンブリのバージョンを生成しています。

-D:product.ver=110

 「-D:product.ver」の値は、初回実行時以外でも常に渡す必要があります。

nant.build内のargsターゲット
<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)
string::substringファンクションの属性
属性名説明
strstring文字列
startIndexint切り出す文字列の開始位置。
lengthint切り出す文字列の長さ。
戻り値
条件戻り値
文字列の長さが0以上の場合元の文字列のstartIndexの位置からlength分の文字数だけを切り出し、新しい文字列として返す。
文字列の長さが0の場合空の文字列を返す。

echoタスク

 echoタスクは、コマンドプロンプトにメッセージを出力したり、ファイルにメッセージを出力します。

echoタスクの属性
属性名説明必須
appendbool値がtrueの場合は、echoタスクでの出力を追記モードに設定。デフォルトは上書モード。×
filefileメッセージを書き出すファイルを指定。×
levelLevelログレベルを指定。デフォルト値はInfo。表「echoタスクのlevel属性で指定できる値」も参照のこと。×
messagestring出力したいメッセージを指定。×(実質必須)
failonerrorboolタスク実行中にエラーが発生した場合、ビルドプロセスを中止させるかどうかを設定。デフォルト値はtrue。×
ifbool値がtrueならば、タスクは実行される。falseならば、タスクはスキップされる。デフォルト値はtrue。×
unlessboolif属性の逆。値がfalseならば、タスクは実行される。trueならば、タスクはスキップされる。 デフォルト値はfalse。×
verbosebool詳細なログを出力するかどうかを設定。デフォルト値はfalse。×

 messege属性とflie属性は、よく利用されます。

 level属性で指定できる値は次のとおりです。

echoタスクのlevel属性で指定できる値
説明
Debugビルドプロセスのデバッグのための、より詳細な情報を出力。
Errorエラーとなるイベントを出力。
Infoビルドプロセスのデバッグのための情報を出力。
Noneすべてのメッセージを出力しない。
Verbose最も詳細な情報を出力。
Warning警告レベルのイベントを出力。

failタスク

 failタスクは、ビルド時に例外が発生し、ビルドが終了した際にメッセージを出力します。

failタスクの属性
属性名説明必須
messagestring例外が発生した場合のために、エラーの原因などをこの属性に設定しておく。×
failonerrorboolタスク実行中にエラーが発生した場合、ビルドプロセスを中止させるかどうかを設定。デフォルト値はtrue。×
ifbool値がtrueならば、タスクは実行される。falseならば、タスクはスキップされる。デフォルト値はtrue。×
unlessboolif属性の逆。値がfalseならば、タスクは実行される。trueならば、タスクはスキップされる。デフォルト値はfalse×
verbosebool詳細なログを出力するかどうかを設定。デフォルト値はfalse。×

3. updateversionターゲット - バージョン保持ファイル内のバージョンを更新する

 このターゲットは、ビルド時に出力されるアセンブリのファイルバージョンを、ビルドするたびに1ずつインクリメントさせるためのものです。scriptタスクを利用し、C#で処理を記述していきます。updateversionターゲットの初回実行時には、バージョン保持ファイルを「C:\Build\Version」ディレクトリに「Project1」という名前で作成します。2回目以降は、作成された「Project1ファイル」内に記述されたバージョン番号(例:1.0.0.0)を読み取り、0の部分を1ずつインクリメントしていきます。ビルドするたびに、バージョン保持ファイル内のバージョン番号が更新されているのを確認してください。また、ビルド後出力されたアセンブリのファイルバージョンが更新されているのを、確認してください。

nant.build内のupdateversionターゲット
<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>

 このコードの処理の流れは以下のとおりです。

  1. スクリプトタスク内に記述するコードの言語を指定します。
  2. <code></code>タグでくくられた部分が、C#のコードとして認識されます。
  3. ScriptMainメソッドでは、NAntのプロパティをscriptタスク内のコードで利用するために、引数としてProject pを渡します。
  4. バージョン保持ファイルのパスを、NAntのversion.fileプロパティから取得します。
  5. 初回実行時でバージョン保持ファイルが作成されていない場合は、strVersionsolution.long.verプロパティの値を設定します。
  6. バージョン保持ファイルが既に存在している場合は、バージョン保持ファイルから前のバージョンを取得し、strVersionに値を設定します。
  7. strVersion(前バージョン)の値を使用して、Versionクラスのインスタンスを初期化します。この値をoldVersionに設定します。
  8. 前バージョン+1の値を、以下の形式で指定して、Versionクラスのインスタンスを初期化します。この値を、curVersionに設定します。
  9. メジャー番号, マイナー番号, ビルド番号, リビジョン番号
    
  10. バージョン保持ファイルに、curVersion(前バージョン+1の値)を書き込みます。
  11. 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にないカスタム関数を定義することも可能です。

scriptタスクの属性
属性名説明必須
languagestringスクリプトブロックで使用する言語を指定。指定可能な値は次のとおり。「VB」「vb」「VISUALBASIC」「C#」「c#」「CSHARP」「JS」「js」「JSCRIPT」「VJS」「vjs」「JSHARP」、もしくはCodeDomProviderを実装するクラスの完全修飾名。
mainclassstringエントリポイントとなるクラスの名前(本稿の例題では、mainclass属性を指定していないため、staticScriptMainメソッドがエントリポイントとなる)。×
prefixstringスクリプト内で定義されたカスタムファンクションのnamespaceプリフィクス。省略された場合は、デフォルトで「script」が指定される。×
failonerrorboolタスク実行中にエラーが発生した場合、ビルドプロセスを中止させるかどうかを設定。デフォルト値はtrue。×
ifbool値がtrueならば、タスクは実行される。falseならば、タスクはスキップされる。デフォルト値はtrue。×
unlessboolif属性の逆。値がfalseならばタスクは実行される。trueならばタスクはスキップされる。デフォルト値はfalse。×
verbosebool詳細なログを出力するかどうかを設定。デフォルト値はfalse。×

 scriptタスク内のコードでは、デフォルトで以下のnamespacesがロードされます。

  • System
  • System.Collections
  • System.Collections.Specialized
  • System.IO
  • System.Text
  • System.Text.RegularExpressions
  • NAnt.Core
scriptタスク内に記述するコードで、注意すべき点
 scriptタスク内で使用できる<code></code>タグは、1つだけです。CDATAセクションでくくられた中のコードは、プレーンなテキストとして扱われます。よって、「"」や「<」などに対して、実体参照や文字参照を使用する必要はありません。
 今回のサンプルのように、特にカスタム関数が定義されていない場合は、staticScriptMainメソッドがエントリポイントとなります。このScriptMainメソッドには、引数Projectのみを渡すことができます。Projectを引数で渡しているため、NAntスクリプト内で定義したプロパティなどを、scriptタスク内のコードで利用することが可能です。
 詳しくは、NAntの公式サイトのscriptタスクの説明を参照してください。

次のページ
4. geneasminfoターゲット- AssemblyInfoファイルの情報を設定する

この記事は参考になりましたか?

NAntスクリプトによるビルド効率化TIPS連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/620 2006/11/29 16:12

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー