特集

MSBuild完全攻略(後編)

ビルド・エンジン「MSBuild」を思いのままに操る技

デジタルアドバンテージ 一色 政彦
2006/05/13

Page1 Page2 Page3

プロジェクト項目の追加 ― <ItemGroup>タグの子要素

 以上でビルド処理を行うための定義が終わったわけだが、肝心の「どのファイルをコンパイルするのか」がまだ定義されていない。つまり次に、ビルドしたいプロジェクト項目を追加してやる必要があるのだ。これを実際に行っているのが次のコードである。

<Project
  DefaultTargets="Build"
  xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
    <Compile Include="Program.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>

  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>
ビルドするプロジェクト項目の追加
<ItemGroup>タグの中に<Compile>タグを記述して、コンパイルしたいプロジェクト項目のファイルを追加する。

 プロジェクト項目は<ItemGroup>タグで囲んだスコープ内に子要素として定義する。

 <Compile>タグでは、そのInclude属性に、コンパイルしたいソース・ファイルを指定することで、そのファイルがコンパイル対象となる(このコード例では「Program.cs」と「Properties\AssemblyInfo.cs」という2つのソース・ファイルをコンパイルするように指定している)。

 なおこの指定は、VS 2005のIDEで、プロジェクト項目のファイルに対して[プロパティ]ウィンドウから設定できる「ビルド アクション」と同じ役割を果たすものだ。

 ItemGroup子要素のプロジェクト項目として記述できる代表的なタグを下の表にまとめた。

タグ名 説明
None なし。コンパイルも出力も行わないファイル
Compile コンパイル。コンパイルとビルド出力を行うソース・ファイル
Content コンテンツ。コンパイルはしないが、コンテンツとして出力するファイル
EmbeddedResource 埋め込まれたリソース。生成されたアセンブリ(.DLLファイルや.EXEファイル)にリソースとして埋め込むファイル
プロジェクト項目(ファイル)に指定可能なプロジェクト項目の種類
 
【コラム】プロジェクト項目でのワイルドカード指定

 <Compile>タグなどのプロジェクト項目のInclude属性では、ワイルドカード(「*」や「?」)を利用できる。従って、例えば「*.cs」のように指定すると、カレント・ディレクトリ内の.csファイルをすべて追加できる。この際、一部の.csファイルを除外したい場合には、そのファイルをExclude属性で指定すればよい。これらの属性の使い方の詳細は、次のページをご覧いただきたい。

参照設定の追加 ― <ItemGroup>タグの子要素

 さらに、上の指定によって追加したソース・ファイルが利用するアセンブリや(Webサービスを呼び出している場合には)Webサービスなどへの参照情報もビルド時に必要となる。この参照設定もプロジェクト項目と同じく、<ItemGroup>タグの子要素により追加できる。具体的には次のようなコードになる。

<Project
  DefaultTargets="Build"
  xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>

  ……中略……
</Project>
プロジェクトへの各種参照設定の追加
<ItemGroup>タグの中に<Reference>タグを記述して参照設定を追加する。

 参照設定も先ほどと同じく<ItemGroup>タグで囲んだスコープ内に子要素として定義する。<Reference>タグでは、そのInclude属性に、参照設定として追加したいアセンブリを指定する(このコード例では「System」と「System.Data」「System.Xml」という3つのアセンブリに対する参照設定を追加している)。

 なおこの指定は、VS 2005のIDEの[ソリューション エクスプローラ]から設定できる「参照の追加」や「Web 参照の追加」と同じ役割を果たすものだ。

 ItemGroup子要素の参照設定として記述できる代表的なタグを下の表にまとめた。

タグ名 説明
Reference アセンブリへの参照
WebReferenceUrl Webサービスへの参照
COMReference COMコンポーネントへの参照
ProjectReference 別のプロジェクトへの参照
プロジェクトへ追加可能な参照の種類

 以上で、MSBuildによるプロジェクトのビルドが可能になった。実際にここまでに作成したMSBuildファイルをMSBuildで実行してみると、プログラムが正しく生成されるのが確認できるだろう(MSBuildによるビルド方法が分からない場合は前回の内容を読み直してほしい)。

プロパティの設定 ― <PropertyGroup>タグの子要素

 しかしビルドできたのはいいが、VS 2005 IDEのプロジェクトのプロパティで指定していた細かな設定情報(例えば「アセンブリ名」や「既定の名前空間」「出力の種類」など)がまったく設定できていない。実はこれらの情報は、「プロパティ(Property)」により指定する必要がある。これは前回解説したプロパティと同じものである。

 MSBuildファイルでは、プロパティは<PropertyGroup>タグの子要素のタグにより指定する。例えば、構成(「Debug」や「Release」などのビルド・モード)に関するプロパティを指定するには、< PropertyGroup>タグの中で<Configuration>タグを記述すればよい。

 具体的には、次のコードのようにして、各種プロパティを設定する。

<Project
  DefaultTargets="Build"
  xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <!-- アセンブリ名 -->
    <AssemblyName>ConsoleApplication1</AssemblyName>
    <!-- 既定の名前空間 -->
    <RootNamespace>ConsoleApplication1</RootNamespace>
    <!-- 出力の種類 -->
    <OutputType>Exe</OutputType>
    <!-- 構成 -->
    <Configuration>Debug</Configuration>
    <!-- プラットフォーム -->
    <Platform>AnyCPU</Platform>
    <!-- 条件付きコンパイル・シンボル -->
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <!-- 出力パス -->
    <OutputPath>bin\Debug\</OutputPath>
  </PropertyGroup>

  ……中略……
</Project>
プロジェクト・プロパティの設定
<PropertyGroup>タグの子要素によって、各プロジェクト・プロパティを設定する。子要素の各タグの意味については、コード中のコメントを参照。例えば<AssemblyName>タグは「アセンブリ名」を指定するためのプロパティである。

 プロジェクト・プロパティを指定するための<PropertyGroup>タグの子要素は、あらかじめ用意されたものだけで本当にたくさんあるのだが、まずは上記のコードのものを覚えておけばよいだろう(これ以外のプロパティについては、前回の「【コラム】MSBuildが提供するすべてのプロパティを調べるには?」をご参照いただきたい)。

 なお、上記のコードの<OutputType>タグに指定できる値は、次のとおりである。

  • コンソール・アプリケーションとして出力→「Exe」
  • Windowsアプリケーションとして出力→「WinExe」
  • クラス・ライブラリとして出力→「Library」
  • マルチ・モジュール・アセンブリとして出力→「Module」

条件分岐 ― Condition属性

 ここまでの作成内容で、VS 2005が新規プロジェクトを作成した直後のプロジェクト・ファイルの内容にかなり近づいた。後は条件分岐を追加して、コンテキストに合わせてプロジェクト・プロパティの設定が切り替わるようになれば、ほぼ同じMSBuildファイルの内容となる。

 条件分岐は各タグのCondition属性により指定できる。例えば、次のような条件分岐を記述するとしよう。

条件分岐1. 外部から構成(=Configurationプロパティ)が設定されていない場合、MSBuildファイル内で自動的に構成を「Debug」に設定する
 
条件分岐2. 現在の構成に応じて、出力パス(=OutputPathプロパティ)を切り替える
  A. 構成=「Debug」 → 出力パス=「bin\Debug\」
  B. 構成=「Release」 → 出力パス=「bin\Release\」

 これを実装したのが次のコードである。

<Project
  DefaultTargets="Build"
  xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <!-- 条件分岐1 -->
    <Configuration
      Condition
=" '$(Configuration)' == '' ">Debug</Configuration>

    <AssemblyName>ConsoleApplication1</AssemblyName>
    <RootNamespace>ConsoleApplication1</RootNamespace>
    <OutputType>Exe</OutputType>
    <Platform>AnyCPU</Platform>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
  </PropertyGroup>

  <!-- 条件分岐2-A -->
  <PropertyGroup
    Condition=" '$(Configuration)' == 'Debug' ">
    <OutputPath>bin\Debug\</OutputPath>
  </PropertyGroup>

  <!-- 条件分岐2-B -->
  <PropertyGroup
    Condition=" '$(Configuration)' == 'Release' ">
    <OutputPath>bin\Release\</OutputPath>
  </PropertyGroup>

  ……中略……

</Project>
Condition属性により条件分岐するプロパティの設定内容
Condition属性による条件分岐に従って、外部から何も構成(DebugかReleaseか)を指定しなければ自動的にDebugが設定され、さらにDebugモードの場合はアセンブリが「bin\Debug\」へ出力され、Releaseモードの場合は「bin\Release\」へ出力されるようになる。

 Condition属性では、文字列と文字列を比較してtrue(同じ)かfalse(違う)かを判定するための次のような式がある。

'<文字列A>' == '<文字列B>'

 上記コードの各Configurationプロパティでは、この式を用いて条件分岐を実現している。つまり、Configurationプロパティの値を文字列として取得して(前にも述べたが、プロパティの値は「$(<プロパティ名>)」という式により取得できる)、「''」(=空文字。つまり設定されていない)や「'Debug'」、「'Release'」などの文字列と比較し、それが等しいかどうかをチェックしているわけだ。ここで文字列の内容が同じ場合のみ、そのタグと配下のタグが有効になる。

 以上、ここまでで次の概念を説明した。

  • <Project>タグ(プロジェクト)
  • <Target>タグ(ターゲット、およびその内部で呼ばれるタスク)
  • <ItemGroup>タグの子要素(プロジェクト項目と参照設定)
  • <PropertyGroup>タグの子要素(プロパティ設定)
  • Condition属性(条件分岐)

 これらを組み合わせて使いこなすことで、VS 2005が生成するプロジェクト・ファイルを読むことも、同じようなMSBuildファイルを作成することもできるはずだ。


 INDEX
  MSBuild完全攻略
  .NETビルド・エンジン「MSBuild」使いこなし術(前編)
    1.「MSBuild」および「MSBuildファイル」とは?
    2.コマンドラインからMSBuildを使いこなす!
 
  ビルド・エンジン「MSBuild」を思いのままに操る技(後編)
    3.MSBuildファイルの基本要素を理解する
  4. プロジェクト項目、プロパティ、条件分岐の記述
    5. カスタム・タスクでMSBuildを思いのままに操る!


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間