条件分岐とエラー制御
MSBuildには、条件分岐やエラー制御という特別な仕組みも用意されています。
条件分岐は、<Project>
要素の子要素として<Choose>
要素を記述し、プロパティやアイテムグループを内包する形で使用します。エラー制御の機能は、<Target>
要素の子要素として<OnError>
要素を記述し、エラーが発生したときの実行ターゲットを指定します。
条件分岐
条件分岐を行うには<Choose>
要素を使用します。<Choose>
要素は、Condition
属性を持つWhen
要素から構成されます。いわゆるif
文と同様に上から下へテストされ、合致した内容が実行されます。Otherwise
要素はどの条件にも合致しなかった場合に実行されます。
<Choose> <When Condition=" 条件1 "> (条件1に合致した場合の設定) </When> <When Condition=" 条件2 "> (条件2に合致した場合の設定) </When> <Otherwise> (すべてのWHENに合致しなかった場合の設定) </Otherwise> </Choose>
<Choose>
要素は、Project
、When
、Otherwise
の各要素の子要素として使用できるため、ネストした条件設定も可能です。条件は、下表の通り設定できます。
条件 | 意味 |
== | 等しい。 |
!= | 等しくない。 |
< | 小なり。 |
> | 大なり。 |
<= | 以下。 |
>= | 以上。 |
Exists('ファイル/フォルダ') | ファイル/フォルダが存在。 |
! | 否定。 |
And | 論理積。 |
Or | 論理輪。 |
() | 複数の式のどれがが真であれば真。 |
文字列が等しいかを比較する場合は、以下のように指定します。
"'$(
プロパティ名)'=='あ い う'"
数値が等しくないかを比較する場合は、以下のように指定します。
"$(
プロパティ名)!=1"
プロパティを囲むシングルクォーテーション「'
」は、値が単純な英数字文字列またはブール値の場合は必要ありません(空の値の比較には必要)。
また、プロジェクトファイルはXML形式であるため、「<
」と「>
」は、それぞれ「<
」と「>
」としてエスケープすることに注意してください。
条件分岐の例
それでは、条件分岐の例を見てみましょう。ここでは、Config
という名前のプロパティがDebug
であればデバッグモードでコンパイルし、Release
であればリリースモードでコンパイルしています。
<Choose> <When Condition=" '$(Config)'=='Debug' "> <PropertyGroup> <Debug>true</Debug> <OutputFile>MsBuildSampleDebug</OutputFile> </PropertyGroup> </When> <When Condition=" '$(Config)'=='Release' "> <PropertyGroup> <Debug>false</Debug> <OutputFile>MsBuildSampleRelease</OutputFile> </PropertyGroup> </When> </Choose> <!-- buildターゲット(C#プロジェクトをコンパイル) --> <Target Name="build" > <CSC Sources="@(CSFile)" References="@(Reference)" OutputAssembly="$(OutputFile).exe" TargetType="winexe" EmitDebugInformation="$(Debug)" /> </Target>
エラー制御
エラー制御を行うには、<OnError>
要素を利用します。MSBuildの実行時にエラーが発生した場合には、<OnError>
要素のExecuteTargets
属性に設定されているターゲットが実行されます。
<Target Name="xxx" > (他のタスク) <OnError ExecuteTargets="エラー時に実行するターゲット名" /> </Target>
それでは、エラー制御する例を見てみましょう。
<!-- runターゲット(C#プロジェクトのEXEを実行) --> <Target Name="run" DependsOnTargets="build"> <Exec Command="$(OutputFile).exe"/> <Message Text="アプリケーションを実行しました。" /> <OnError ExecuteTargets="ErrorMsg" /> </Target> <!-- ErrorMsgターゲット(エラー発生時に実行するタスク) --> <Target Name="ErrorMsg" > <Message Text="×××××エラー×××××" /> </Target>
この例の場合、run
ターゲットで、実行するべきexeファイルが存在しないなどのエラーが発生すると、ErrorMsg
ターゲットのメッセージを表示させることができます。
なお、この応用のサンプルの全文は、サンプルファイルの「2.When.bat」と「sample2.proj」に記載しているので、興味のある方は参照/実行してみてください。
MSBuildの追加ライブラリの利用
MSBuildには、Microsoftが標準で提供しているタスク以外にも利用できる拡張タスクがあります。執筆時点で、利用可能主要な外部ライブラリには、次の2つがあります。
- The MSBuild Community Tasks Project
- Microsoft Services (UK) Enterprise Solutions Build Framework (SBF)
この2つの外部ライブラリについて説明します。
The MSBuild Community Tasks Project
「The MSBuild Community Tasks Project」は、オープンソースにて開発されているタスク群です。主要なタスクについて下表に整理します。
タスク名 | 説明 |
AppPoolController | IISがインストールされているローカル(リモート)マシンでアプリケーションプールをコントロール。 |
AppPoolCreate | ローカル(リモート)マシンでアプリケーションプールを作成。 |
AppPoolDelete | ローカル(リモート)マシンでアプリケーションプールを削除。 |
AssemblyInfo | 与えられた属性を使用してAssemblyInfoファイルを生成。 |
Attrib | ファイル、ディレクトリの属性を変更。 |
FileUpdate | 正規表現を使用して、ファイルの中のテキストを置換。 |
FtpUpload | FTPを使用してファイルをアップロード。 |
FxCop | コードを分析、チェックする「FxCop」を実行。 |
Mail | メールを送信。 |
Math.Add | 加算。 |
Math.Divide | 除算。 |
Math.Multiple | 掛算。 |
Math.Subtract | 減算。 |
Move | 新しい位置にファイルを移動。 |
NDoc | ドキュメンテーションを作成する「NDoc」を実行。 |
NUnit | テストツール「NUnit」を実行。 |
RegistryRead | レジストリから読み込み。 |
RegistryWrite | レジストリに書き込み。 |
Script | タスク中に含まれたコードを実行。 |
ServiceController | Windowsサービスを制御。 |
ServiceQuery | サービスの状態を決定。 |
Sleep | 指定された期間、停止。 |
SqlExecute | SQLコマンドを実行。 |
SvnCheckout | Subversion(ソース管理リポジトリ)からチェックアウト。 |
SvnClient | Subversionクライアント。 |
SvnCommit | Subversionへコミット。 |
SvnExport | Subversionからエクスポート。 |
SvnInfo | ファイル/ディレクトリのSubversion情報取得。 |
SvnUpdate | Subversionへアップデート。 |
SvnVersion | Subversionからローカルコピーのリビジョン取得。 |
TaskSchema | アセンブリのMSBuildタスクのXSDスキーマを生成。 |
Time | 現在の日時を取得。 |
Unzip | ZIPファイルを特定のディレクトリに解凍。 |
Version | テキストファイルに保存された4つのバージョン番号をインクリメント。 |
VssAdd | VisualSourceSafe(ソース管理リポジトリ)へ追加。 |
VssCheckin | VisualSourceSafeへチェックイン。 |
VssCheckout | VisualSourceSafeからチェックアウト。 |
VssDiff | VisualSourceSafeの中の2つのバージョンの間のDiff(差分比較)を生成。 |
VssGet | VisualSourceSafeからファイル/プロジェクトの最新版を取得。 |
VssHistory | VisualSourceSafeから、2つの日付/ラベルにおけるヒストリを含むXMLファイルを生成。 |
VssLabel | VisualSourceSafeへラベル設定。 |
VssUndoCheckout | VisualSourceSafeへチェックアウトを取消。 |
WebDirectoryCreate | ローカル(リモート)マシンでウェブディレクトリ作成。 |
WebDirectoryDelete | ローカル(リモート)マシンでウェブディレクトリ削除。 |
WebDownload | 指定されたURIのリソースをローカルファイルにダウンロード。 |
XmlRead | XMLファイルからXPathを使用して値を読み込み。 |
XmlWrite | XPathを使用してXMLファイルを更新。 |
Xslt | XMLをXSLTで変換。 |
Zip | ファイルを圧縮してZIPファイルを作成。 |
Microsoft Services (UK) Enterprise Solutions Build Framework (SBF)
「Microsoft Services (UK) Enterprise Solutions Build Framework (以下、SBF)」は、GotDotNetにて開発/公開されています。タスク数が多いため、名前空間別に主な機能について整理します。
名前空間(Microsoft.Sdc.Taskは省略) | 説明 |
ActiveDirectory.User(Group) | ActiveDirectoryのグループ管理。 |
BizTalk2004(2006) | BizTalk Server関連。 |
Cab | Cab形式の圧縮・解凍。 |
Certificates | pfxかcerファイルから証明書をインポート。 |
CodeCoverage | CoverageEye.NETでカバレッジ。 |
ComponentServices.Application(Componet) | コンポーネントサービス(COM+)の管理。 |
Configuration.InstalledProducts | インストールされた製品・コンポーネントの構成。 |
EventSource | イベントログ用のイベントソースの管理。 |
File | ファイル操作(読取専用削除/取得/正規表現)。 |
Folder | フォルダ操作(コピー/フォルダ情報取得)。 |
Folder.Share | 共有フォルダ管理。 |
GlobalAssemblyCache | GAC(GlobalAssemblyCache)管理。 |
Help | HTML Helpドキュメントの操作。 |
Math | アイテムリストを使った足し算。 |
MessageQueue | MQ(MessageQueue)の管理。 |
Msi | Msi形式のインストーラの管理。 |
Network | ホスト名のチェック/ホスト名からIPの取得。 |
PerformanceCounters | パフォーマンスカウンタコンポーネントの登録/削除。 |
Registry | レジストリ操作。 |
Security | アクセス権(ACL)の操作。 |
ServiceProcess | サービスの開始/停止/確認。 |
SourceDepot | SourceDepot(ソース管理ソフト)の操作。 |
SourceSafe | VSSの操作(ラベル管理等)。 |
SourceTfs | TFSソース管理の操作。 |
Sql(Access/Role) | DBへのSQLの実行/権限の管理など。 |
Summary | 概略報告の出力。 |
Time | 現地時刻の算出/差分/XMLレポート。 |
Tools | DevEnv(Visula StudioのIDE本体)/FxCop(ソースコード規約チェック)/Installshield(インストーラ作成)/NDoc(ドキュメント生成)/NUnit(ユニットテスト)などの操作。 |
Tools.StrongName | 厳密な名前付きアセンブリの管理。 |
VersionNumber | 「Versionnumber.exe」によるバージョン管理。 |
VirtualServer(VirtualMachine/VirtualMachine.OS) | Virtul Server(仮想サーバ)の管理。 |
Web.AppPool | IIS 6.0アプリケーションプールの管理。 |
Web.FtpSite | FTPサーバの管理。 |
Web.ServiceExtension | IIS 6.0のWeb拡張機能の管理。 |
Web.Smtp | SMTPサーバの管理。 |
Web.WebSite | Webサイトの管理。 |
Wix | Windows Installer XML(Wix)インストーラの操作。 |
Xml(XmlFile) | XMLの操作。 |
Zip | J# 2.0を利用したZIPファイル操作。 |
なし(Microsoft.Sdc.Tasks.* ) | 上記の名前空間に属さない機能(Ping/Sleepなど)。 |
拡張ライブラリの使用方法
これらの拡張ライブラリを利用するには、まず、タスクを格納したライブラリファイルをそれぞれのサイトからダウンロードします。The MSBuild Community Tasks Projectの場合はインストーラを実行します(SBFの場合はZIP形式で提供されています)。プロジェクトファイルで利用するには、Project
タグの下に、次のようなImport
タグを追記します。
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\
MSBuild.Community.Tasks.Targets"/>
これによって、外部ライブラリのタスクが利用できるようになります。タスクの利用方法は標準タスクと同様です。タスクごとの詳細な設定については、各ヘルプを参照するとよいでしょう。
*.targets
」として用意します。このターゲットファイルを使用することで、プロジェクトファイルの保守性と可読性が向上されます。まとめ
以上、MSBuildについて紹介してきました。もしかしたら、MSBuildと同様の機能を持つNAntとのどちらを利用するかで悩むことになるかもしれません。
MSBuildの長所は、Microsoft純正ツールのため.NET Frameworkと共にインストールされることや、正規にサポートされている製品であることが挙げられます。これに対してNAntには、JavaのAntを知っている人や、今後Javaでの開発が想定される開発者には教育負荷が少ないというメリットがあります。また、オープンソースのため、必要があればソースコードを参照できるという特長もあります。両方ともよく利用され、拡張ライブラリの数も着実に増えているので、開発チームのメンバーの状況に合わせて選択するとよいのではないでしょうか。
それでは、最後にMSBuildについてまとめておきましょう。
- MSBuildは、多くの作業を自動化することができるビルドツールです。
- 自動化できる機能としては、Microsoftが提供している標準機能に加え、オープンソースの追加タスクも提供されています。
- 自動化したい作業をプロジェクトファイルに記述し、「MSBuild.exe」から実行します。
- プロジェクトファイルは、プロジェクト、アイテムコレクション、プロパティ、ターゲットから構成されます。
- 条件分岐やエラー制御を行うことができます。
今回は簡単なサンプルでしたが、実際の開発時には他のさまざまなタスクを組み合わせて効率化を図っていくとよいでしょう。
参考資料
- MSDN 『MSBuildの概念』
- MSDN 『MSBuildリファレンス』
- NAgile.com
- @IT 『MSBuild完全攻略(前編) .NETビルド・エンジン「MSBuild」使いこなし術』 一色政彦 著、2006年4月
- @IT 『NAgileで始める実践アジャイル開発~第4回 ミッション:ビルドを自動化セヨ!』 黒石高広 著、2006年9月
- Visual Studio MSBuild フォーラム(英語)
- The MSBuild Community Tasks Project:英語
- Microsoft Services (UK) Enterprise Solutions Build Framework (SBF):英語