プロジェクトファイルの記述
それでは、プロジェクトファイルを書いていきましょう。MSBuildでは「プロジェクト」「アイテムグループ」「プロパティ」「ターゲット」といった用語を理解する必要があります。プロジェクトファイルの大まかな構成は下図のようになります。
- プロジェクト: プロジェクトファイルの全体的な設定を記述します。
- プロパティ: プロジェクトファイルで使用する変数を設定します。変数を利用することによって、設定の変更を局所化できるメリットがあります。
- アイテムグループ: ビルドシステムへの入力を表す項目のグループを設定します。
- ターゲット:プロジェクトのビルド方法を定義します。ここでは、先ほど説明した「タスク」をどのような順序で、どのように実行するか(何を自動化したいか)という作業内容を記述します。
1. プロジェクト(プロジェクトファイルの基本定義)の記述
プロジェクトファイルのルートには、プロジェクト(<project>
要素)を設定します。<project>
要素には次の属性を設定できます。
属性名 | 説明 | 必須 |
DefaultTargets | デフォルトのターゲット。 | × |
InitialTargets | 必ず事前に実行される初期化用ターゲット。 | × |
ここでは、実行するターゲット名を指定しないときにデフォルトで動作する「デフォルトターゲット」として"build"
を設定しました。
<Project DefaultTargets="build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
「xmlns
~」の設定は、XML名前空間(XML Name Spase)を指定する属性で、MSBuildのプロジェクトファイルであることを示しています。このxmlns
属性を定義することによって、Visual Studioのエディタではインテリセンスが機能するようになります。
2. プロパティ(使用する変数)の記述
続けてプロパティ(<PropertyGroup>
要素)を設定します。プロパティはプロジェクトファイル内で使える変数で、文字列の値を持ちます。まずは、以下の基本的な構文を覚えておけばよいでしょう。
<PropertyGroup> <プロパティ名>プロパティ値</プロパティ名> <プロパティ名>プロパティ値</プロパティ名> (繰り返し) </PropertyGroup>
サンプルの例では、以下のようにProjectName
という名前のプロパティを宣言し、値にMsBuildSample
を代入しています。
<PropertyGroup> <ProjectName>MsBuildSample</ProjectName> </PropertyGroup>
ここで設定したプロパティは、後ほど実行ファイル名として利用されます。利用するときには、「$(ProjectName)
」というように「$(プロパティ名)
」と記述することで値を取得できます。なお、PropertyGroup
とプロパティ名には、Condition
という評価条件を属性として設定することもできます。
MSBuildの予約済みプロパティ
MSBuildには、プロジェクトファイルやMSBuildに関する予約済みプロパティが用意されています。これらのプロパティは、宣言しなくともプロジェクトファイルの中で利用することができます。
予約済みプロパティ | 説明 | 例 |
MSBuildProjectDirectory | プロジェクトファイルの絶対パス | C:\MyFolder |
MSBuildProjectFile | プロジェクトファイル名 | My.proj |
MSBuildProjectExtension | プロジェクトファイルの拡張子 | .proj |
MSBuildProjectFullPath | プロジェクトファイルの絶対パスとファイル名 | C:\MyFolder\My.proj |
MSBuildProjectName | プロジェクトファイル名(拡張子なし) | My |
MSBuildBinPath | 「MSBuild.exe」の絶対パス | C:\WINDOWS\Microsoft.NET\ Framework\v2.0.50727 |
MSBuildProjectDefaultTargets | DefaultTargets 属性で指定されたターゲット | <ProjectDefaultTargets="A;B"> の場合、「A;B」 |
MSBuildExtensionsPath | 「Program Files」下の「MSBuild」フォルダ | <ImportProject= "$(MSBuildExtensionsPath) \MyFiles\OtherCustom.targets"/> |
3. アイテムグループ(使用する入力項目グループ)の記述
続けてアイテムグループを設定します。アイテムグループ(ItemGroup
)はプロジェクトファイル内で使える入力項目の集まりで、複数のアイテム(Item
)を格納することができます。基本的には次のように記述します。
<ItemGroup> <アイテム名>アイテム値</アイテム名> <アイテム名>アイテム値</アイテム名> (繰り返し) </ItemGroup>
サンプルの例では、次のように設定します。
<ItemGroup> <CSFile Include="**\*.cs"/> <Reference Include="System.dll"/> <Reference Include="System.Data.dll"/> <Reference Include="System.Drawing.dll"/> <Reference Include="System.Windows.Forms.dll"/> <Reference Include="System.XML.dll"/> </ItemGroup>
まず「CSFile
」という項目(アイテム)を宣言し、値に"**\*.cs"
を代入しています。これは、配下のフォルダに含まれる、拡張子が.csのファイルを対象にすることを表しています。
さらに「Reference
」という項目を宣言し、参照するDLLの名前を連続して代入しています。このように、アイテムグループでは、同じ名前の項目に複数の値を設定することができます。
なお、アイテムグループには、Condition
という評価条件を属性として設定することもできます。また、アイテムには下表の属性が設定可能です
属性名 | 説明 | 必須 |
Include | アイテムに含めるファイルまたはワイルドカード。 | ○ |
Exclude | アイテムから除外するファイルまたはワイルドカード。 | × |
Condition | 評価する条件。 | × |
ここで設定したアイテムグループは、後ほどコンパイル時の入力項目として利用されます。利用するときには、「@(Reference)
」というように「@(アイテムグループ名)
」と記述することで値を取得できます。
4. ターゲット(MSBuildから呼び出す機能単位)の記述
最後に、ターゲット(<target>
要素)を設定します。ターゲットとは、MSBuildから呼び出せる最小の作業単位のことです。ここでは、コンパイルを行うbuild
ターゲットとアプリケーションの実行を行うrun
ターゲットを作成します。
buildターゲット(コンパイル)
まず、コンパイルをするbuild
ターゲットを次のように記述します。
<Target Name="build" > <CSC Sources="@(CSFile)" References="@(Reference)" OutputAssembly="$(ProjectName).exe" TargetType="winexe" /> </Target>
<Target>
要素には、次の属性を設定できます。
属性名 | 説明 | 必須 |
name | ターゲットの名前。 | ○ |
DependsOnTargets | 依存するターゲット名(複数の場合はカンマ区切り)。 | × |
Inputs | 入力アイテム。 | × |
Outputs | 予想される出力。 | × |
Condition | 評価する条件。 | × |
タスクの設定
ターゲットの設定では実行したいタスクを定義します。ここではC#のコンパイラを呼び出す<CSC>
タスクの設定をしています。設定できる属性はタスクによって異なりますが、<CSC>
タスクでは主に次のような属性を設定できます。
属性名 | 説明 | 必須 |
Sources | Visual C#ソース。 | × |
References | 参照設定。 | × |
OutputAssembly | 出力ファイルの名前。 | × |
TargetType | 出力ファイルのファイル形式(library, exe, winexe, moduleのいずれか)。 | × |
EmitDebugInformation | trueの場合デバッグ情報(*.pdb)が生成される。 | × |
ここでは、「$(~)
」という構文を利用してプロパティを読み込み、「@(~)
」という構文を利用してアイテムグループを読み込んでいます。
runターゲット(アプリケーションの実行)
さらに、アプリケーションを実行するrun
ターゲットを設定します。run
ターゲットでは、<Exec>
タスクを利用しますが、ここでは、DependsOnTargets
属性も指定しています。
<Target Name="run" DependsOnTargets="build"> <Exec Command="$(ProjectName).exe"/> <Message Text="アプリケーションを実行しました。" /> </Target>
DependsOnTargets
属性を設定すれば、ターゲットに依存関係を設定することができます。依存関係を設定すれば、実行予定のターゲットの実行前にDependsOnTargets
属性に指定したターゲットが実行されます。
この例では、「DependsOnTargets="build"
」と設定しているため、run
ターゲットを起動する前に、build
ターゲットが実行されるようになります。また、DependsOnTargets
属性は、カンマ区切りで複数指定することもでき、カンマ区切りの場合は先頭から順番に実行されます。
そして、プログラムを実行する<Exec>
タスクでアプリケーションを起動するように設定しています。ここでは、「MsBuildSample.exe」を実行します
属性名 | 説明 | 必須 |
Command | 実行するプログラム。 | ○ |
WorkingDirectory | プログラムを実行するディレクトリ。 | × |
ターゲットの中には複数のタスクを加えることができます。複数のタスクを書いた場合には上から順に実行されていきます。ここでは、プログラム実行した後に、メッセージを出力する<Message>
タスクで完了メッセージを出力しています。
属性名 | 説明 | 必須 |
Text | 出力するメッセージ。 | × |
Importance | メッセージの重要度。[high/normal/low] | × |
<Message>
タスクのImportace
属性を設定するとメッセージの色を変えることができます。
MSBuildによるビルドの実行
それでは、最後にMSBuildを使ってビルドしてみましょう。MSBuildを起動するには、コマンドプロンプトからプロジェクトファイルがあるフォルダ上で以下のコマンドを実行します。
C:\WINDOWS\Microsoft.NET\Framework\<バージョン>\MSBuild.exe
これによりMSBuildがプロジェクトファイルを読み込み、ビルドを実行します(頻繁に利用する場合は、Path環境変数に「MSBuild.exe」を登録しておくとよいでしょう)。
また、手動で実行するばかりではなく、Windowsのタスクスケジューラを利用して、定時に自動起動することもできます。詳細は以下のサイトを参考にしてください。
- 『タスク・スケジューラとWSHで定例処理を実現する』(@IT)
本稿では、コマンドプロンプトを例に説明します。なお、どの方法でも「MSBuild.exe」を起動するので、パラメータやオプションの指定方法は同じです。
デフォルトターゲット「build」の実行
デフォルトターゲットである「build
」を実行するときは、「sample.proj」のあるフォルダで以下のコマンドを実行します。
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe sample.proj
すると下のような実行結果が表示され、プロジェクトのコンパイルが行われます。
ビルドが 2006/10/14 0:43:50 を開始しました。 __________________________________________________ プロジェクト "C:\MsBuild\sample.proj" (既定のターゲット): ターゲット build: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Csc.exe /reference :System.dll /reference:System.Data.dll /reference:System.Drawing.dll /reference:System.Windows.Forms.dll /reference:System.XML.dll /out: MsBuildSample. exe /target:winexe src\Form1.cs src\Form1.Designer.cs src\Program.cs src\Properties\AssemblyInfo.cs src\Properties\Resources.Designer.cs src\Properties\Settings.Designer.cs ビルドに成功しました。` 0 警告 0 エラー 経過時間 00:00:00.38
「ビルドに成功しました。」と表示されていることを確認してください。設定が間違っていると「ビルドに失敗しました。」と表示されるので、エラーメッセージをもとに原因を修正してください。
このように、MSBuildコマンドを引数なしで実行すると、<Project>
要素のDefaultTargets
属性に設定したデフォルトターゲットが呼び出されます。今回の場合、実行時のログに「ターゲット build:」と表示されていることを確認してください
ターゲット「run」の実行
次に、デフォルトターゲットではない、run
ターゲットを実行します。ターゲットを実行するには以下のコマンドを入力します。
MsBuild /target:ターゲット名
ここでは次のように入力します。
C:\MsBuild>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe sample.proj /target:run
これにより下のような実行結果が表示され、アプリケーションが起動します。アプリケーションを終了すると、後続の処理が流れMSBuildの実行が完了します。
ビルドが 2006/10/14 3:49:03 を開始しました。 _________________________________________________ プロジェクト "C:\MsBuild\sample.proj" (run ターゲット): ターゲット build: (省略) ターゲット run: MsBuildSample.exe アプリケーションを実行しました。 ビルドに成功しました。 0 警告 0 エラー 経過時間 00:00:02.25
ログからrun
ターゲットがよびだされていることが分かります。run
ターゲットは依存関係に「DependsOnTargets="build"
」と記述しているので、run
の前にbuild
が動いていることも確認できます。
MsBuild /target:ターゲット名1,ターゲット名2,ターゲット名3...
MSBuild.exeのオプション
「MSBuild.exe」にはスラッシュ(/)から始まるオプションを指定することができます。オプションを指定することで、プロジェクトファイルを指定したり、プロジェクトファイルの説明を表示したりといったことが可能になります。これらのオプションは、「MsBuild /help」と入力すると表示されます。
「MSBuild.exe」には以下のようなオプションがあります。
オプション | 説明 |
/help | 使用方法を表示(/?、/hも使用可)。 |
/nologo | 著作権メッセージを非表示。 |
/version | バージョン情報だけ表示(/verも使用可)。 |
@file | テキストファイルからコマンドライン設定を挿入。 |
/target:targets | ターゲットを指定。セミコロン(;)またはコンマを使用して複数のターゲットを指定(/tも使用可)。 |
/property:name=value | プロパティを設定(上書き)。nameはプロパティ名、valueはプロパティ値。セミコロン(;)またはコンマを使用して複数のプロパティを指定(/pも使用可)。 |
/logger:logger | MSBuildからのイベントをログに記録するloggerを指定。 |
/consoleloggerparameters:parameters | コンソールloggerに渡されるパラメータを指定。 |
/verbosity:level | イベントログに情報量を表示。 |
/noconsolelogger | 既定のコンソールloggerを無効にし、イベントのログをコンソールに記録。 |
/validate:schema | プロジェクトファイルを検証し、成功した場合はプロジェクトをビルド。 |