はじめに
アプリケーションの開発中は、思いのほか同じような定型作業を繰り返しているものです。.NET Framework 2.0に含まれているMSBuildというツールを利用すると、そうした手間を省くことができ、プログラミングそのものに専念できるようになります。本稿では、MSBuildの概要と使用例について紹介します。なお、MSBuildと同様の機能を持つオープンソースライブラリ「NAnt」についての紹介記事『NAntを活用して開発時の作業を自動化する』も併せてご覧いただくことをおすすめします。
対象読者
Visual Studio(.NET)にて開発を行っている方、作業の効率化・自動化に興味のある方を対象としています。
必要な環境
本稿のサンプルプログラムは.NET Framework 2.0と同時にインストールされるMSBuildにて動作確認をしています。そのため、添付ファイルを解凍して、バッチファイルを実行するだけで簡単に動作を確認することができます。
サンプルの概要
まず、本稿のサンプルファイルをダウンロードします。サンプルのプロジェクトファイルは
- Windowsアプリケーションをコンパイル。
- アプリケーションを実行。
という手順で、MSBuildを使って実行します。
ビルドの実行は以下の手順になります。
- コマンドプロンプトを起動する。
- ダウンロードファイルを解凍したフォルダに移動する。
- 「1.Simple.bat」を実行して、ビルドを実行する。
MSBuildの特長
「MSBuild(Microsoft Build Engine)」は、Microsoft製品(WindowsプラットフォームやVisual Studio)で利用できる新しいビルドツールです。ビルドツールを利用すると、Visual Studioがインストールされていないサーバ環境でも容易にアプリケーションをコンパイルしたり、繰り返し手作業で行うべき作業を自動化したりできます。
MSBuildでは、「MSBuildプロジェクトファイル形式(以下、プロジェクトファイル)」というXMLの設定ファイルを書くことによって、手動で行っている定型作業を簡単に実行することが可能になります。
Microsoft純正ツール
MSBuildの最大の魅力は.NET Framework 2.0に同梱されていることです。このため、別途新しいソフトウェアをインストールする必要はありません。また、Microsoftが正式にサポートしているため、安心してプロジェクトで利用することができます。
なお、.NET Framework 1.1で利用する場合には、マイクロソフトのコード共有サイト「CodePlex」から、「MSBee」という同機能のツールをダウンロードすることができます。
豊富なタスク
MSBuildは、呼び出せる機能の多さにも魅力があります。この機能のことをMSBuildでは「タスク」と呼んでいます。標準で利用できるタスクには下表のようなものがあります。
タスク名 | 説明 |
AL | アセンブリリンカ「Al.exe」を実行。 |
AspNetCompiler | ASP.NETのプリコンパイラ「aspnet_compiler.exe」を実行。 |
AssignCulture | カルチャIDの割り当て。 |
CallTarget | ターゲットの呼び出し。 |
Copy | ファイルを新しい場所にコピー。 |
CreateItem | 入力されたアイテムでアイテムコレクションを作成。 |
CreateProperty | 渡された値を使用してプロパティを作成。 |
Csc | C#コンパイラ「CSC.exe」を実行。 |
Delete | 指定されたファイルを削除。 |
Error | 条件の評価に基づいてビルドを停止し、エラーをログに記録。 |
Exec | 指定されたプログラムを実行。 |
FindUnderPath | コレクション内のどのアイテムが、指定されたフォルダ(サブフォルダ)に格納されているかを確認。 |
GenerateApplicationManifest | ClickOnceアプリケーションマニフェスト(またはネイティブマニフェスト)の作成。 |
GenerateBootstrapper | アプリケーションを、自動的に検出、ダウンロード、インストールする方法を提供。 |
GenerateDeploymentManifest | ClickOnce配置マニフェストを生成。 |
GenerateResource | .txtおよび.resxファイルを.resourcesバイナリファイルに変換(「resgen.exe」類似機能)。 |
GetAssemblyIdentity | 指定されたファイルからアセンブリIDを取得し出力。 |
GetFrameworkPath | .NET Frameworkアセンブリのパスを取得。 |
GetFrameworkSdkPath | .NET Framework SDKのパスを取得。 |
LC | ライセンスコンパイラ「Lc.exe」を実行。 |
MakeDir | ディレクトリを作成。 |
Message | ビルド中のメッセージをログに記録。 |
MSBuild | 他のMSBuildプロジェクトからMSBuildプロジェクトをビルド。 |
ReadLinesFromFile | テキストファイルからアイテムの一覧を読み込み。 |
RegisterAssembly | アセンブリのメタデータからレジストリに追加(「Regasm.exe」類似機能)。 |
RemoveDir | ディレクトリを削除。 |
ResGen | .txtおよび.resxファイルを.resourcesバイナリファイルに変換(「resgen.exe」類似機能)。 |
ResolveAssemblyReference | 指定したアセンブリに依存するすべてのアセンブリを解決。 |
ResolveComReference | タイプライブラリ名または.tlbファイルの一覧から、ライブラリのディスク上の位置を解決。 |
ResolveKeySource | 厳密な名前のキーのソースを確認。 |
ResolveNativeReference | ネイティブ参照を解決。 |
SGen | アセンブリの種類に対応するXMLシリアル化アセンブリを作成。 |
SignFile | 証明書で指定されたファイルに署名。 |
Touch | ファイルのアクセス時刻および更新時刻を設定。 |
UnregisterAssembly | COM相互運用のために、指定されたアセンブリの登録を解除(RegisterAssembly タスクの逆)。 |
Vbc | VB.NETコンパイラ「vbc.exe」を実行。 |
VCBuild | VisualC++プロジェクトをビルドする「vcbuild.exe」を実行。 |
Warning | 条件の評価に基づいてビルド中の警告をログに記録。 |
WriteLinesToFile | 指定したテキストファイルに書き込み。 |
このタスク一覧を見ると、MSBuildを使って、コンパイルしたり、ファイルを操作したりといったビルドに関する基本的な操作ができることが分かります。各機能の詳細について興味のある方は以下のサイトを参照してください。
- 「MSBuildのタスクリファレンス」(MSDN)
また、独自にタスクを作成することもできます。詳細は、MSDNの「タスクを記述する」を参照してください。
設定が容易
また、MSBuildでは、プロジェクトファイルと呼ばれるXMLの設定ファイルに従ってタスクを実行させることができます。本稿で作成するプロジェクトファイルの完成形は次のようになります。
<Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <!-- =========== プロパティ ========== --> <PropertyGroup> <ProjectName>MsBuildSample</ProjectName> </PropertyGroup> <!-- ======= アイテムグループ ======== --> <ItemGroup> <CSFile Include="**\*.cs"/> <Reference Include="System.dll"/> <Reference Include="System.Data.dll"/> <Reference Include="System.Drawing.dll"/> <Reference Include="System.Windows.Forms.dll"/> <Reference Include="System.XML.dll"/> </ItemGroup> <!-- =========== ターゲット ========== --> <!-- buildターゲット(C#プロジェクトをコンパイル) --> <Target Name="build" > <CSC Sources="@(CSFile)" References="@(Reference)" OutputAssembly="$(ProjectName).exe" TargetType="winexe" /> </Target> <!-- runターゲット(C#プロジェクトのEXEを実行) --> <Target Name="run" DependsOnTargets="build"> <Exec Command="$(ProjectName).exe"/> <Message Text="アプリケーションを実行しました。" /> </Target> </Project>
複雑そうに見えるかもしれませんが、タスクに応じたパラメータを記述するだけなので、バッチファイルよりも簡単に設定を記述することができます。
MSBuildには、この他にも「実行順序の指定」「条件に応じた分岐」「エラー発生時の処理」など、便利な制御機能も備わっています。このようにビルドツールとして十分な機能を備えているため、MSBuildが利用される機会が増えてきています。
プロジェクトファイル作成とMSBuildの実行手順
引き続き、MSBuildで必要な設定について紹介します。MSBuildを実行するには、一般的に次の手順が必要になります。
- プロジェクトファイルの作成
- プロジェクトファイルの記述
- プロジェクト(プロジェクトファイルの基本定義)の記述
- プロパティ(使用する変数)の記述
- アイテムグループ(使用する入力項目グループ)の記述
- ターゲット(MSBuildから呼び出す機能単位)の記述
- MSBuildの実行
ここでは、「Windowsアプリケーションプロジェクトをコンパイルして、アプリケーションを実行する」というシナリオを紹介します。
プロジェクトファイルの作成
作業内容を記述するプロジェクトファイルはXMLファイルです。Visual Studioから作成する場合は、ソリューションエクスプローラでプロジェクトを右クリックし、メニューから[新しい項目の追加]-[XMLファイル]を選択して作成します。
プロジェクトファイルの名前には「*.proj」という拡張子を付けることを推奨します。これは、「*.proj」という拡張子にしておくと、MSBuildを実行する際に、自動でファイルを検出することができるためです。
プロジェクトファイルの1行目には、以下のようなXMLの宣言が書かれています。これはそのまま残しておきます。
<?xml version="1.0" encoding="utf-8" ?>
また、テキストファイルで作成する場合、encodingの設定はutf-8で保存するように注意してください。
興味のある方は、本稿のサンプルファイルをダウンロードして、そこに含まれる「3.Project.bat」を実行し、C#のプロジェクトファイルを、MSBuildで読み込んでコンパイルさせてみてください。
また、MSBuildでは、ソリューションファイルを利用してビルドを行うこともできます。複数のプロジェクトが存在するソリューションの開発をしている場合は、ソリューションファイルを指定してビルドを行うとよいでしょう。詳細については、以下の記事を参照してください。