SHOEISHA iD

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

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

特集記事

NAntを活用して開発時の作業を自動化する

ソフトウェアのライフサイクルに応じて作業の効率化を図る


  • X ポスト
  • このエントリーをはてなブックマークに追加

ビルドファイル作成とNAntの実行手順

 NAntの魅力について理解していただけたところで、NAntで必要な設定について紹介します。NAntを実行するには、一般的に次の手順が必要になります。

  1. ビルドファイルの作成
  2. ビルドファイルの記述
    1. プロジェクトの設定(ビルドファイルの基本定義の設定)
    2. プロパティの設定(使用する変数の設定)
    3. ターゲットの設定(NAntから呼び出す機能単位の設定)
  3. 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>要素には次の属性を設定できます。

<project>の属性
属性名 説明 必須
name NAntプロジェクトの名前 ×
default デフォルトのターゲット ×
basedir ファイルの場所を決定するときに用いるベースディレクトリ ×

 ここでは、

default.build(一部)
<project name="NAntSample" default="build" basedir=".">
(中略)
</project>

 のように、ビルドファイルの目的をあらわす「プロジェクト名」にNAntSampleを、実行するターゲット名を指定しないときに動作する「デフォルトターゲット」にbuildを、ビルド時の基準ディレクトリとなる「ベースディレクトリ」にピリオド(ビルドファイルと同じ場所)を設定しました。

2.プロパティ(使用する変数)の記述

 続けてプロパティ<property>要素)を設定します。プロパティはビルドファイル内で使える変数で、文字列の値を持ちます。<property>要素には次の属性を設定できます。

<property>の主要属性
属性名 説明 必須
name プロパティの名前(ピリオドで区切った名前がよく利用される)
value プロパティの値
overwrite 値が設定済みの場合、値を上書きするか(初期値はtrue) ×
readonly 定数のような読み取り専用のプロパティにするか(初期値はfalse) ×
failonerror プロパティの設定に失敗したときエラーとして処理を中断するか(初期値はtrue) ×
if trueの場合のみプロパティを設定(unlessの逆) ×
unless falseの場合のみプロパティを設定(ifの逆) ×

 まずは、よく利用される<property name="プロパティ名" value="プロパティ値"/>というパターンを覚えておけば良いでしょう。ここでは、

default.build(一部)
<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>要素の属性はどれもよく利用するので、しっかりと覚えておくとビルドファイルを効率的に編集できるようになるでしょう。

<target>要素の主要属性
属性名 説明 必須
name ターゲットの名前
depends 依存するターゲット名(複数時はカンマ区切り) ×
if 指定したプロパティが存在する場合のみターゲットをビルド(unlessの逆) ×
unless 指定したプロパティが存在しない場合のみターゲットをビルド(ifの逆) ×
description ターゲットの説明 ×

 ここでは、コンパイルを行う「build」ターゲットとアプリケーションの実行を行う「run」ターゲットを作成します。

buildターゲットの記述

 コンパイルをする「build」ターゲットを次のように記述します。

default.build(一部)
<!-- buildターゲット -->
<target name="build" description="Visual Studioソリューションのビルド">
  <solution configuration="Debug" solutionfile="${basename}.sln" />
</target>
<solution>タスクの設定

 ターゲットでは、自動化したいタスクの設定を行います。ここでは<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属性は、カンマ区切りで複数指定することもできます)。

default.build(一部)
<!-- runターゲット -->
<target name="run" depends="build" description="アプリケーションの実行">
  <exec program="${basename}.exe" basedir="bin" />
  <echo message="${datetime::now()}に実行しました。" />
</target>
<exec>タスクの設定

 そして、runターゲットでは、<exec>タスクで、ビルドしたアプリケーションを起動するように設定しています。ここでは、「bin」フォルダの「NAntSampleVB2003.exe」を実行します。

<exec>タスクの主要属性
属性名 説明 必須
program 実行するプログラム
basedir プログラムのあるディレクトリ ×
<echo>タスクの設定

 1つのターゲットに複数のタスクを記述することができます。複数のタスクを書いた場合には上から順に実行されます。

 ここでは、<exec>タスクでプログラムを実行した後に、<echo>タスクで完了メッセージを出力しています。

<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の関数リファレンスをご覧ください。

次のページ
NAntによるビルドの実行

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 青木 淳夫(アオキ アツオ)

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

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

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/354 2008/08/19 20:26

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング