MSBuildの要素を理解する |
MSBuildはいくつかの要素を含む。 その中で最初から知っておく必要があるのは、「Property」と「Item」、「Task」である。Propertyは重要なキーと値の組であり、その値の基となるのは、環境変数、コマンドラインスイッチ、プロジェクトファイル内のProperty要素から得られる。
<Property OutputDir="bin\" /> |
Itemは、ファイルの配列と考えればよい。Itemはワイルドカードを使用したり、特定のファイルを除外したりできる。MSBuildはItem要素のType属性を使用してItemを分類する。
<Item Type="Compile" Include="*.cs" Exclude="DebugStuff.cs" /> |
Taskはビルドプロセスの最小単位のユニットである。Taskは、Property要素およびItem要素、単純な文字列から、入力パラメータを受け付けることができる。このTaskのName属性が、Taskを実行するために必要な.NETのビルドデータ型を特定する。Taskは、他の複数のTaskが利用するItemを提供できる。MSBuildは多くのTaskを含んでおり、その全てが.NETのツールタスクもしくは展開タスク、シェルタスクとして、大まかにカテゴライズされる。
例えば、「Csc」というNameを持つTaskは、ビルドツールとしてC#コンパイラを呼び出す。C#コンパイラは、Source属性(Type属性がCompileのItem要素を指定する)で指定された全てのItem要素をコンパイルし、アウトプットとしてアセンブリを生成する。
<Task Name="Csc" AssemblyName= "$(OutputDir)\HelloWorld.exe" Sources="@(Compile)" /> |
Targetはビルドプロセスにおいてタイムスタンプ分析を行うことができる、1つの論理ステップである。つまり、Targetは必要がなければ実行されないということである。Targetは要求された処理を実行するために、1つもしくは複数のTaskを実行する。
<Target Name="CopyToServer" Inputs="$(OutputDir)\HelloWorld.exe" Outputs="\\DeployServer\$(BuildNum)\HelloWorld.exe" DependsOnTargets="Compile"> <Task Name="Copy" ... /> </Target> |
Condition属性は、シンプルなifステートメントと大まかには同じである。Conditionは2つの文字列を比較したり、ファイルやディレクトリの存在を確認したりできる。Conditionは、プロジェクトファイル内の各種の要素に対して応用できる。例えば、Configurationプロパティが値としてDebugを持っている場合にのみ定義されるプロパティのグループは次のようになる。
<PropertyGroup Condition= " '$(Configuration)'=='Debug' " > <Property ... /> <Property ... /> </PropertyGroup> |
Importは、C/C++の#includeステートメントのようなものである。インポートされたプロジェクトの内容は、それが行われた時に、論理的にはインポートする側のプロジェクトの一部になる。
<Import Project= "$(LAPI)\WindowsApplication.target" /> |
ここまでで用語の解説は終りだ。以降は典型的なプロジェクトファイルを使って、実行可能なLonghornアプリケーションのビルドを確認してみよう(コラム2参照)。
すべてのプロジェククトファイルは、Projectと名づけられたルート要素を用いて書き始める。そのDefaultTargets属性は、ユーザーがターゲットを指定しなかったときに、ビルドされるべきシステムのターゲット名を指定する。以下のサンプルでは、デフォルトでシステムがビルドすべきターゲット名としてBuildが指定されている。
<Project DefaultTargets="Build"> <PropertyGroup> <Property Language="C#" /> <Property DefaultClrNameSpace= "IntroLonghorn" /> <Property TargetName="MyApp" /> </PropertyGroup> <Import Project= "$(LAPI)\WindowsApplication.target" /> <ItemGroup> <Item Type="ApplicationDefinition" Include="MyApp.xaml" /> <Item Type="Pages" Include="HomePage.xaml" /> <Item Type="Pages" Include="DetailPage.xaml" /> <Item Type="Code" Include="DetailPage.xaml.cs"/> <Item Type="DependentProjects" Include= "MyDependentAssembly.proj" /> <Item Type="Components" Include="SomeThirdParty.dll" /> <Item Type="Resources" Include="Picture1.jpg" FileStorage="embedded" Localizable="False"/> <Item Type="Resources" Include="Picture2.jpg" FileStorage="embedded" Localizable="True"/> </ItemGroup> </Project> |
すべてのプロジェクトファイルは、Projectと名づけられたルート要素の定義で開始されている。DefaultTargets属性は、ターゲットが明示的に指定されない場合に、システムがビルドするターゲットの名前を指定する。プロパティの値をベースにして、ビルド規則は条件付きでの実行が可能である。
なお、アプリケーションのプロジェクトは、少なくともLanguageおよびTargetNameのプロパティ値を指定する必要がある。コラム2のサンプルは、言語としてC#を指定し、アプリケーション名がMyAppになるように指定している。また、DefaultClrNameSpaceというプロパティの値も指定している。
© Copyright 2001-2005 Fawcette Technical Publications