MSBuild色々出来るよ2011/04/02 お だ
自己紹介織田 信亮 (おだ しんすけ)新日本コンピュータマネジメント という会社で開発者やってます。個人的に興味のある技術等を blog で取り上げてます。 http://d.hatena.ne.jp/odashinsuke/SQL World/わんくま同盟/JGGUG 等の勉強会に参加してます
アジェンダMSBuildってなに?どんなことが出来るの?拡張も出来るよ力技で何でも出来る!まとめ
MSBuildってなに?
MSBuildとはMicrosoft Build Engine (MSBuild) Visual Studio 2005(.NET 2.0)から利用出来るようになったビルドプラットフォームです。XML ベースのプロジェクトファイル(.*proj)を用いて設定します。
MSBuildの主な構成要素プロパティ (Property)項目 (Item)タスク (Task)ターゲット (Target)http://msdn.microsoft.com/ja-jp/library/dd393574.aspx
プロパティ/項目プロパティビルドを設定するためのキーと値のペア項目ビルド システムへの入力であり、通常はファイルを表します繰り返し項目(ワイルドカードで、ファイルを指定)等、プロパティより柔軟に使える値の格納場所メタデータも設定可能(ビルド以外でも利用される)
タスクタスクビルド処理を実行するために使用される一連の実行可能コードです(コンパイルしたり、外部ツールを実行したり…)実際に動く最小単位の処理
ターゲットターゲットタスクを特定の順序でグループ化し、プロジェクト ファイルの各セクションを、ビルド プロセスのエントリ ポイントとして公開する役割を果たします。幾つかのタスクを取りまとめた MSBuildで実行する単位
デモWindows Form プロジェクトファイルを見てみよう
おまけMSBuild 4 からは、プロパティで関数の呼び出しが出来るようになっています。http://msdn.microsoft.com/ja-jp/library/dd633440.aspx
どんなことが出来るの?
標準のタスクを一部紹介Cscお馴染みC#コンパイラの呼び出しMakeDir名前の通りディレクトリの作成CallTargetターゲットの呼び出しExecプログラムやコマンドを実行
デモMSBuildで Hello World
.Targets ファイル一般的なシナリオ向けにアイテム、プロパティ、ターゲット、およびタスクが定義されたファイル
デモどこでコンパイルしているか.Targets ファイルを追いかけてみる
1.C# プロジェクト作成2.DefaultTarget="Build" となっている3.Build という ターゲット は プロジェクトファイルに定義されていない4.<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> を発見5.%windir%\Microsoft.NET\Framework\バージョン番号 に targets ファイルがあるので見てみる6.Build という ターゲット は CSharp.targetsにも定義されていない7.<Import Project="Microsoft.Common.targets" /> を発見8.Common.targetsファイルを見てみる9.Build ターゲット 発見(BeforeBuild, CoreBuild, AfterBuildの順で呼ばれる)  BeforeBuild、AfterBuildでは何もしていない?!
10.CoreBuildターゲット を見てみる11.Compile ターゲット を見てみる12.CoreCompileターゲット を見てみる13.Common.targetsに CoreCompileが無い!CSharp.targetsに戻って確認14.CSC タスクを使ってますね。15.プロジェクトファイルに、BeforeBuild, AfterBuildを定義する16.ビルドを実行すると、BeforeBuild、AfterBuildが動いている事が確認できる。17.CSharp.targetsを Import する前に、BeforeBuild、AfterBuildを定義すると…実行されない
プロパティやターゲットは上書きされるプロパティ/ターゲットは、最後に定義された物で上書きされる。プロジェクトファイルの CSharp.targetsファイル Import 以降にBuild ターゲットを再定義すると…
拡張も出来るよ
カスタムタスクの紹介MSBuildComminutyTaskshttp://msbuildtasks.tigris.org/MSBuild Extension Packhttp://msbuildextensionpack.codeplex.com/
自前で用意する場合MSBuild.Build.Framework.ITaskを実装 (Microsoft.Build.Framework.dll)既定の実装として、MSBuild.Build.Utilities.Task(Microsoft.Build.Utilities.V4.0.dll) が用意されているので、これを継承し、Execute メソッドを実装
デモ自前で用意するタスクの実装/利用
力技で何でも出来る!
Exec タスクで何でも出来る!Exec タスクは、直接プロセスを呼び出す代わりに cmd.exe を呼び出します。http://msdn.microsoft.com/ja-jp/library/x8zx72cd.aspxcmd.exe を呼び出すので、何でも出来る
Exec タスクで何でも出来る!NUnitの実行PartCoverの実行Sandcastle の実行
色んなタスクを組み合わせると…ソース管理から最新ファイルを取得ビルドテスト/レポートの作成必要なファイルをZIP 圧縮Hudson(Jenkins)、CCNET、TFS 等のCI サーバーと組み合わせると便利!CI サーバーが無くても、Windows のタスク等で昼休み/夜間に実行するとか
まとめMSBuildは XML ベースで設定するビルドツールVisual Studio 上での設定も含んでる知らなくても特に問題無いチームに一人は知ってる人が居ると良いかも

Ms build 色々出来るよ