SHOEISHA iD

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

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

特集記事

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

.NET Framework 2.0に同梱されるビルドツールを利用して作業の効率化を図る


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

プロジェクトファイルの記述

 それでは、プロジェクトファイルを書いていきましょう。MSBuildでは「プロジェクト」「アイテムグループ」「プロパティ」「ターゲット」といった用語を理解する必要があります。プロジェクトファイルの大まかな構成は下図のようになります。

  • プロジェクト: プロジェクトファイルの全体的な設定を記述します。
  • プロパティ: プロジェクトファイルで使用する変数を設定します。変数を利用することによって、設定の変更を局所化できるメリットがあります。
  • アイテムグループ: ビルドシステムへの入力を表す項目のグループを設定します。
  • ターゲット:プロジェクトのビルド方法を定義します。ここでは、先ほど説明した「タスク」をどのような順序で、どのように実行するか(何を自動化したいか)という作業内容を記述します。

1. プロジェクト(プロジェクトファイルの基本定義)の記述

 プロジェクトファイルのルートには、プロジェクト(<project>要素)を設定します。<project>要素には次の属性を設定できます。

<project>要素の属性
属性名説明必須
DefaultTargetsデフォルトのターゲット。×
InitialTargets必ず事前に実行される初期化用ターゲット。×

 ここでは、実行するターゲット名を指定しないときにデフォルトで動作する「デフォルトターゲット」として"build"を設定しました。

sample.proj(抜粋)
<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を代入しています。

sample.proj(抜粋)
<PropertyGroup>
    <ProjectName>MsBuildSample</ProjectName>
</PropertyGroup>

 ここで設定したプロパティは、後ほど実行ファイル名として利用されます。利用するときには、「$(ProjectName)」というように「$(プロパティ名)」と記述することで値を取得できます。なお、PropertyGroupとプロパティ名には、Conditionという評価条件を属性として設定することもできます。

MSBuildの予約済みプロパティ

 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
MSBuildProjectDefaultTargetsDefaultTargets属性で指定されたターゲット<ProjectDefaultTargets="A;B">の場合、「A;B」
MSBuildExtensionsPath「Program Files」下の「MSBuild」フォルダ<ImportProject= "$(MSBuildExtensionsPath) \MyFiles\OtherCustom.targets"/>

3. アイテムグループ(使用する入力項目グループ)の記述

 続けてアイテムグループを設定します。アイテムグループ(ItemGroup)はプロジェクトファイル内で使える入力項目の集まりで、複数のアイテム(Item)を格納することができます。基本的には次のように記述します。

アイテムグループの設定方法
<ItemGroup>
    <アイテム名>アイテム値</アイテム名>
    <アイテム名>アイテム値</アイテム名>
                (繰り返し)
</ItemGroup>

 サンプルの例では、次のように設定します。

sample.proj(抜粋)
<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ターゲットを次のように記述します。

sample.proj(抜粋)
<Target Name="build" >
    <CSC
        Sources="@(CSFile)"
        References="@(Reference)"
        OutputAssembly="$(ProjectName).exe"
        TargetType="winexe" />
</Target>

 <Target>要素には、次の属性を設定できます。

<Target>要素の主要属性
属性名説明必須
nameターゲットの名前。
DependsOnTargets依存するターゲット名(複数の場合はカンマ区切り)。×
Inputs入力アイテム。×
Outputs予想される出力。×
Condition評価する条件。×

タスクの設定

 ターゲットの設定では実行したいタスクを定義します。ここではC#のコンパイラを呼び出す<CSC>タスクの設定をしています。設定できる属性はタスクによって異なりますが、<CSC>タスクでは主に次のような属性を設定できます。

<CSC>タスクの主要属性
属性名説明必須
SourcesVisual C#ソース。×
References参照設定。×
OutputAssembly出力ファイルの名前。×
TargetType出力ファイルのファイル形式(library, exe, winexe, moduleのいずれか)。×
EmitDebugInformationtrueの場合デバッグ情報(*.pdb)が生成される。×

 ここでは、「$(~)」という構文を利用してプロパティを読み込み、「@(~)」という構文を利用してアイテムグループを読み込んでいます。

runターゲット(アプリケーションの実行)

 さらに、アプリケーションを実行するrunターゲットを設定します。runターゲットでは、<Exec>タスクを利用しますが、ここでは、DependsOnTargets属性も指定しています。

sample.proj(抜粋)
<Target Name="run" DependsOnTargets="build">
    <Exec Command="$(ProjectName).exe"/>
    <Message Text="アプリケーションを実行しました。" />
</Target>

 DependsOnTargets属性を設定すれば、ターゲットに依存関係を設定することができます。依存関係を設定すれば、実行予定のターゲットの実行前にDependsOnTargets属性に指定したターゲットが実行されます。

 この例では、「DependsOnTargets="build"」と設定しているため、runターゲットを起動する前に、buildターゲットが実行されるようになります。また、DependsOnTargets属性は、カンマ区切りで複数指定することもでき、カンマ区切りの場合は先頭から順番に実行されます。

 そして、プログラムを実行する<Exec>タスクでアプリケーションを起動するように設定しています。ここでは、「MsBuildSample.exe」を実行します

<Exec>タスクの主要属性
属性名説明必須
Command実行するプログラム。
WorkingDirectoryプログラムを実行するディレクトリ。×

 ターゲットの中には複数のタスクを加えることができます。複数のタスクを書いた場合には上から順に実行されていきます。ここでは、プログラム実行した後に、メッセージを出力する<Message>タスクで完了メッセージを出力しています。

<Message>タスクの主要属性
属性名説明必須
Text出力するメッセージ。×
Importanceメッセージの重要度。[high/normal/low]×

 <Message>タスクのImportace属性を設定するとメッセージの色を変えることができます。

MSBuildによるビルドの実行

 それでは、最後にMSBuildを使ってビルドしてみましょう。MSBuildを起動するには、コマンドプロンプトからプロジェクトファイルがあるフォルダ上で以下のコマンドを実行します。

C:\WINDOWS\Microsoft.NET\Framework\<バージョン>\MSBuild.exe

 これによりMSBuildがプロジェクトファイルを読み込み、ビルドを実行します(頻繁に利用する場合は、Path環境変数に「MSBuild.exe」を登録しておくとよいでしょう)。

 また、手動で実行するばかりではなく、Windowsのタスクスケジューラを利用して、定時に自動起動することもできます。詳細は以下のサイトを参考にしてください。

 本稿では、コマンドプロンプトを例に説明します。なお、どの方法でも「MSBuild.exe」を起動するので、パラメータやオプションの指定方法は同じです。

デフォルトターゲット「build」の実行

 デフォルトターゲットである「build」を実行するときは、「sample.proj」のあるフォルダで以下のコマンドを実行します。

デフォルトターゲットの実行(コマンドプロンプト)
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe sample.proj

 すると下のような実行結果が表示され、プロジェクトのコンパイルが行われます。

デフォルトターゲット「Build」の実行結果(コマンドプロンプト)
ビルドが 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:ターゲット名

 ここでは次のように入力します。

runターゲットの実行(コマンドプロンプト)
C:\MsBuild>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe 
sample.proj /target:run

 これにより下のような実行結果が表示され、アプリケーションが起動します。アプリケーションを終了すると、後続の処理が流れMSBuildの実行が完了します。

runターゲットの実行結果(コマンドプロンプト)
ビルドが 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.exe」ではカンマで区切ってターゲットを記述することで、ターゲットを複数個、左から順に連続して実行させることができます
複数ターゲットの指定
MsBuild /target:ターゲット名1,ターゲット名2,ターゲット名3...

MSBuild.exeのオプション

 「MSBuild.exe」にはスラッシュ(/)から始まるオプションを指定することができます。オプションを指定することで、プロジェクトファイルを指定したり、プロジェクトファイルの説明を表示したりといったことが可能になります。これらのオプションは、「MsBuild /help」と入力すると表示されます。

 「MSBuild.exe」には以下のようなオプションがあります。

「MSBuild.exe」のオプション
オプション説明
/help使用方法を表示(/?/hも使用可)。
/nologo著作権メッセージを非表示。
/versionバージョン情報だけ表示(/verも使用可)。
@fileテキストファイルからコマンドライン設定を挿入。
/target:targetsターゲットを指定。セミコロン(;)またはコンマを使用して複数のターゲットを指定(/tも使用可)。
/property:name=valueプロパティを設定(上書き)。nameはプロパティ名、valueはプロパティ値。セミコロン(;)またはコンマを使用して複数のプロパティを指定(/pも使用可)。
/logger:loggerMSBuildからのイベントをログに記録するloggerを指定。
/consoleloggerparameters:parametersコンソールloggerに渡されるパラメータを指定。
/verbosity:levelイベントログに情報量を表示。
/noconsolelogger既定のコンソールloggerを無効にし、イベントのログをコンソールに記録。
/validate:schemaプロジェクトファイルを検証し、成功した場合はプロジェクトをビルド。

次のページ
条件分岐とエラー制御

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

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

もっと読む

この記事の著者

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

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング