ms build 色々出来るよ
TRANSCRIPT
わんくま同盟 大阪勉強会 #42
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 Taskshttp://msbuildtasks.tigris.org/
• MSBuild Extension Packhttp://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 上での設定も含んでる• 知らなくても特に問題無い• チームに一人は知ってる人が居ると良い
かも