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