Document

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