特集

MSBuild完全攻略(前編)

.NETビルド・エンジン「MSBuild」使いこなし術

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

Page1 Page2

MSBuildによるソリューション・ビルド

 答えは、VS 2005のソリューション・ファイル(=「*.sln」ファイル)もMSBuildからビルドできる(ただし、ソリューション・ファイルはMSBuildファイルではない。これについては下記の【コラム】を参照)。つまり、上記のバッチ・ファイルの内容は次のように記述してもよいわけだ。

msbuild ConsoleApplication1\ConsoleApplication1.sln
MSBuildでソリューションをビルドする方法
ここではmsbuild.exeへのパスを通すためのコマンド実行は省略しているが実際には必要(なお以降もパスを通すためのコマンドは省略する。そのたびに同様のコメントは記述しないので注意すること)。

 さらにMSBuildは、(「*.*proj」ファイルと同様に)「*.sln」ファイルを自動的に検出してビルドすることもできる。従って次のようにも記述できる。

cd ConsoleApplication1
msbuild
ソリューション・ファイルを指定しないMSBuildコマンドの呼び出し
この場合は、「ConsoleApplication1.sln」が自動的にMSBuildファイルとして使われる。

 VS 2005を使っている場合は、むしろこのようにMSBuildでソリューション・ファイルを指定してビルドした方が、ソリューションに含まれるすべてのプロジェクト・ファイルがビルドされるので都合が良いだろう。筆者としてもMSBuildでソリューション・ファイルを指定する方法をお勧めする。

【コラム】ソリューション・ファイルはMSBuildファイルではない!

 ここで注意すべきなのは、ソリューション・ファイルはMSBuildファイルではないことだ。実際にVS 2005が生成したプロジェクト・ファイル「ConsoleApplication1.csproj」とソリューション・ファイル「ConsoleApplication1.sln」の内容をテキスト・エディタなどで開いて調べてみると、それが確認できる。本稿のサンプル・アプリケーションでは、それぞれ次のようなテキスト内容になっていた。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ……省略……
</Project>
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
……省略……
MSBuildに指定するファイルのテキスト内容(上:プロジェクト・ファイル、下:ソリューション・ファイル)
プロジェクト・ファイルはXMLフォーマットのMSBuildファイルだが、ソリューション・ファイルはそうではない。

 一目瞭然(りょうぜん)だが、プロジェクト・ファイルはXMLフォーマットであるのに対して、ソリューション・ファイルの方は独自のテキスト形式になっている。つまり、ソリューション・ファイルはVS 2005専用のフォーマットであり、その内容をMSBuildがそのままで解析することはできない(このため、ソリューション・ファイルを人間が手動で作成することは難しい)。

 それでは、なぜMSBuildにソリューション・ファイルを指定できるのかというと、MSBuildはソリューション・ファイルをメモリ上でMSBuildファイルに変換しているからだ。その内容を参照するには、MSBuildを実行する際に「MSBuildEmitSolution」環境変数に「1」をセットすればよい。これにより、メモリ上の内容が外部ファイルとして出力されるようになる。具体的には次のような内容のバッチ・ファイルを作成すればよい。

@Set Path=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;%PATH%
Set MSBuildEmitSolution=1
msbuild ConsoleApplication1\ConsoleApplication1.sln
ソリューション・ファイルから変換されたMSBuildファイルを出力する方法
MSBuildEmitSolution環境変数に1をセットすると、「ConsoleApplication1.sln.proj」というMSBuildファイルが(ソリューション・ファイルと同じフォルダに)生成される。

 このバッチ・ファイルを実行すると、「ConsoleApplication1.sln.proj」という名前のMSBuildファイルが、ソリューション・ファイルと同じフォルダに生成される(MSBuildEmitSolution環境変数によって生成されるMSBuildファイルの命名規則は「<ソリューション名.sln.proj>」となる)。もちろん、このMSBuildファイルをMSBuildのコマンドライン引数に渡してビルドするようなことも可能だ。また、このファイルを編集することでソリューションのビルド・プロセスを手動でカスタマイズできる。

 以上により、取りあえず定期的にビルド作業を無人自動実行できるようになった。

 しかし、実際にビルドされた出力ファイルを見てみると、Debugモードで出力されていることが分かる(つまり「Bin\Debug」フォルダ内にプログラムが生成されている)。これは、VS 2005が生成するプロジェクト・ファイル(=MSBuildファイル)の内容がデフォルトではDebugモードとなってしまうからだ。この動作をmsbuild.exeのコマンドライン実行時に変更するには、コマンドライン・スイッチ(=オプション)を指定する必要がある。次にそれについて説明する。

3. MSBuildのコマンドライン・スイッチを使いこなす!

 ここではMSBuildでよく使うコマンドライン・スイッチを紹介する。

 なおコマンドライン・スイッチは、コマンドライン引数(=MSBuildファイルの指定)の「前」「後」のどちらに記述してもよい(コマンドライン引数を指定しない場合はコマンドライン・スイッチのみを記述する)。また、大文字/小文字は区別されないので気にする必要はないし、複数のコマンドライン・スイッチを続けて記述してよい。

Releaseモードのビルドを実現するPropertyスイッチ

 例えばVS 2005のプロジェクトをReleaseモードでビルドしたい場合には、次のように記述する。

cd ConsoleApplication1\ConsoleApplication1
msbuild ConsoleApplication1.csproj /p:Configuration=Release
ReleaseモードでVS 2005プロジェクトをビルドする方法

 「/p」スイッチは「/property」の省略形で、プロジェクト・ファイル内で指定されたプロパティの値を設定(=上書き更新)するためのものだ。なおプロパティとはプロジェクトの性質を表すためのデータで、例えば上記のコマンドラインは「Configuration(構成)」というプロジェクトの性質(=プロパティ)を「Releaseモード」にセットしている。

 このように、MSBuildはPropertyスイッチ経由で外部からそのビルド・プロセスの挙動をカスタマイズできるわけだ。

 Propertyスイッチの構文は次のとおり。

/property:<プロパティ名>=<設定する値> 

 このようなプロパティが、(VS 2005が生成する)MSBuildファイルでは覚えきれないほどたくさん提供されているのだが、ここではそのうち一連のビルド・プロセスの自動化(主にバッチ・ファイル)でよく使うと思われるものを、次の表にまとめた。

プロパティ名 説明
Configuration 構成(「Debug」や「Release」などのビルド・モード)を指定する
Platform プラットフォーム(「AnyCPU」などの対応するCPU環境)を指定する
DefineConstants 条件付きコンパイル・シンボル(「DEBUG」や「TRACE」。または、独自に定義したシンボルなど)を指定する。複数を指定する場合には、セミコロン(;)で区切る
OutputPath 出力フォルダのパス(例えば「bin\Debug\」や「bin\Release\」など)を指定する
MSBuildが標準で提供する主なプロパティの一覧
 
【コラム】MSBuildが提供するすべてのプロパティを調べるには?

 .NET Framework 2.0のランタイムがインストールされている場所(基本的には「C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727」)にある「MSBuild」フォルダ内の「Microsoft.Build.Commontypes.xsd」というファイルを参照し、コメントで「PROPERTIES」と書かれたところ以降を見るとよい。

ビルド方法を指定できるTargetスイッチ

 アプリケーションをビルドする際に、完全にリビルドしたい場合やコンパイルだけしたいようなケースは多々あるだろう。通常のMSBuildの実行ではビルドのみが行われるが、例えばそれをリビルドに切り替えたいような場合には、次のように記述すればよい。

cd ConsoleApplication1\ConsoleApplication1
msbuild ConsoleApplication1.csproj /t:Rebuild
VS 2005プロジェクトをリビルドする方法

 「/t」スイッチは「/target」の省略形で、一連のビルド・プロセスで実行するターゲットを指定する。MSBuildにおいてこの「ターゲット(Target)」とは、「処理プロセスの1単位」を意味する。例えば「ビルド」や「コンパイル」などの各処理プロセスがそれぞれ1つのターゲットである。

 通常、このターゲットには依存関係が定義されており(つまりメインの処理プロセスが実行する複数の子の処理プロセスが定義されており)、例えば「Rebuild」(=リビルド)というメインのターゲットを実行すると、基本的には(Rebuildターゲットが依存している)「BeforeRebuild」「Clean」「Build」「AfterRebuild」という4つの子のターゲットを順に実行する。依存関係にあるBuildターゲットはまたほかのターゲットに依存しており、さらにその依存先のターゲットがそのほかのターゲットに依存しているという構造になっているため、ツリー階層をすべてたどっていくような感じで、リビルドで必要なすべての処理プロセス(=ターゲット)が階層的に実行されるわけだ。

 要するにTargetスイッチでは、どの処理プロセス(=ターゲット)を一連のビルド・プロセスのエントリポイントとして実行するのかを指定するわけである。

 Targetスイッチの構文は次のようになっている。

/target:<ターゲット名>[;<そのほかのターゲット>……]

 指定するターゲット名は、セミコロン(;)やカンマ(,)で区切ることで複数続けて記述することができる。例えば、出力ファイルなどをいったんクリーン(Clean)にして、ビルドを行いたい場合には、次のように記述すればよい。

msbuild ConsoleApplication1.csproj /t:Clean;Build
複数のターゲットを指定したMSBuildの呼び出し

 このように、コマンドラインからMSBuildを呼び出すタイミングで、ビルドする処理プロセス(つまりビルド方法)を自由に切り替えられるのだ。ターゲットについてもたくさんのものが提供されているが、次の表によく使うと思われるものだけをまとめておいた。

ターゲット名 説明
Compile プロジェクトのコンパイル
Build プロジェクトのビルド
Rebuild プロジェクトのリビルド
Clean プロジェクトのクリーン。すべての中間ファイルおよびビルド出力ファイルを削除する
Publish プロジェクトのClickOnce発行
Run .EXEファイルの場合、最終的な出力ファイルを実行する
MSBuildが標準で提供する主なターゲットの一覧
 
【コラム】MSBuildが提供するすべてのターゲットを調べるには?

 .NET Framework 2.0のランタイムがインストールされている場所(基本的には「C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727」)にある「MSBuild」フォルダ内の「Microsoft.Common.targets」というファイルを参照すればよい。

そのほかのコマンドライン・スイッチについて

 以上で示したMSBuildコマンドライン・スイッチを知っておけば、通常のチーム開発で使うバッチ処理などでは事足りるだろう。ただし、ここで紹介したもの以外にも数多くのスイッチが用意されているので、興味がある読者諸氏は次のページをご参照いただきたい。

 以上、今回はMSBuildの実行方法を中心に解説した。MSBuildは、非常に柔軟なビルド・システムであるため、デフォルトでは提供されていないタスクなど、何でも思いどおりの処理を実行させることができる。次回はそのMSBuildのカスタム処理についても説明する予定だ。End of Article


 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 記事ランキング

本日 月間