SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

MSBuildを活用して開発時の作業を自動化する

.NET Framework 2.0に同梱されるビルドツールを利用して作業の効率化を図る


  • X ポスト
  • このエントリーをはてなブックマークに追加

条件分岐とエラー制御

 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>要素は、ProjectWhenOtherwiseの各要素の子要素として使用できるため、ネストした条件設定も可能です。条件は、下表の通り設定できます。

条件式で使用できる記号
条件意味
==等しい。
!=等しくない。
<小なり。
>大なり。
<=以下。
>=以上。
Exists('ファイル/フォルダ')ファイル/フォルダが存在。
!否定。
And論理積。
Or論理輪。
()複数の式のどれがが真であれば真。

 文字列が等しいかを比較する場合は、以下のように指定します。

"'$(プロパティ名)'=='あ い う'"

 数値が等しくないかを比較する場合は、以下のように指定します。

"$(プロパティ名)!=1"

 プロパティを囲むシングルクォーテーション「'」は、値が単純な英数字文字列またはブール値の場合は必要ありません(空の値の比較には必要)。

 また、プロジェクトファイルはXML形式であるため、「<」と「>」は、それぞれ「&lt;」と「&gt;」としてエスケープすることに注意してください。

条件分岐の例

 それでは、条件分岐の例を見てみましょう。ここでは、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」は、オープンソースにて開発されているタスク群です。主要なタスクについて下表に整理します。

The MSBuild Community Tasks Projectのタスク(抜粋)
タスク名説明
AppPoolControllerIISがインストールされているローカル(リモート)マシンでアプリケーションプールをコントロール。
AppPoolCreateローカル(リモート)マシンでアプリケーションプールを作成。
AppPoolDeleteローカル(リモート)マシンでアプリケーションプールを削除。
AssemblyInfo与えられた属性を使用してAssemblyInfoファイルを生成。
Attribファイル、ディレクトリの属性を変更。
FileUpdate正規表現を使用して、ファイルの中のテキストを置換。
FtpUploadFTPを使用してファイルをアップロード。
FxCopコードを分析、チェックする「FxCop」を実行。
Mailメールを送信。
Math.Add加算。
Math.Divide除算。
Math.Multiple掛算。
Math.Subtract減算。
Move新しい位置にファイルを移動。
NDocドキュメンテーションを作成する「NDoc」を実行。
NUnitテストツール「NUnit」を実行。
RegistryReadレジストリから読み込み。
RegistryWriteレジストリに書き込み。
Scriptタスク中に含まれたコードを実行。
ServiceControllerWindowsサービスを制御。
ServiceQueryサービスの状態を決定。
Sleep指定された期間、停止。
SqlExecuteSQLコマンドを実行。
SvnCheckoutSubversion(ソース管理リポジトリ)からチェックアウト。
SvnClientSubversionクライアント。
SvnCommitSubversionへコミット。
SvnExportSubversionからエクスポート。
SvnInfoファイル/ディレクトリのSubversion情報取得。
SvnUpdateSubversionへアップデート。
SvnVersionSubversionからローカルコピーのリビジョン取得。
TaskSchemaアセンブリのMSBuildタスクのXSDスキーマを生成。
Time現在の日時を取得。
UnzipZIPファイルを特定のディレクトリに解凍。
Versionテキストファイルに保存された4つのバージョン番号をインクリメント。
VssAddVisualSourceSafe(ソース管理リポジトリ)へ追加。
VssCheckinVisualSourceSafeへチェックイン。
VssCheckoutVisualSourceSafeからチェックアウト。
VssDiffVisualSourceSafeの中の2つのバージョンの間のDiff(差分比較)を生成。
VssGetVisualSourceSafeからファイル/プロジェクトの最新版を取得。
VssHistoryVisualSourceSafeから、2つの日付/ラベルにおけるヒストリを含むXMLファイルを生成。
VssLabelVisualSourceSafeへラベル設定。
VssUndoCheckoutVisualSourceSafeへチェックアウトを取消。
WebDirectoryCreateローカル(リモート)マシンでウェブディレクトリ作成。
WebDirectoryDeleteローカル(リモート)マシンでウェブディレクトリ削除。
WebDownload指定されたURIのリソースをローカルファイルにダウンロード。
XmlReadXMLファイルからXPathを使用して値を読み込み。
XmlWriteXPathを使用してXMLファイルを更新。
XsltXMLをXSLTで変換。
Zipファイルを圧縮してZIPファイルを作成。

Microsoft Services (UK) Enterprise Solutions Build Framework (SBF)

 「Microsoft Services (UK) Enterprise Solutions Build Framework (以下、SBF)」は、GotDotNetにて開発/公開されています。タスク数が多いため、名前空間別に主な機能について整理します。

SBFのタスク(抜粋)
名前空間(Microsoft.Sdc.Taskは省略)説明
ActiveDirectory.User(Group)ActiveDirectoryのグループ管理。
BizTalk2004(2006)BizTalk Server関連。
CabCab形式の圧縮・解凍。
Certificatespfxかcerファイルから証明書をインポート。
CodeCoverageCoverageEye.NETでカバレッジ。
ComponentServices.Application(Componet)コンポーネントサービス(COM+)の管理。
Configuration.InstalledProductsインストールされた製品・コンポーネントの構成。
EventSourceイベントログ用のイベントソースの管理。
Fileファイル操作(読取専用削除/取得/正規表現)。
Folderフォルダ操作(コピー/フォルダ情報取得)。
Folder.Share共有フォルダ管理。
GlobalAssemblyCacheGAC(GlobalAssemblyCache)管理。
HelpHTML Helpドキュメントの操作。
Mathアイテムリストを使った足し算。
MessageQueueMQ(MessageQueue)の管理。
MsiMsi形式のインストーラの管理。
Networkホスト名のチェック/ホスト名からIPの取得。
PerformanceCountersパフォーマンスカウンタコンポーネントの登録/削除。
Registryレジストリ操作。
Securityアクセス権(ACL)の操作。
ServiceProcessサービスの開始/停止/確認。
SourceDepotSourceDepot(ソース管理ソフト)の操作。
SourceSafeVSSの操作(ラベル管理等)。
SourceTfsTFSソース管理の操作。
Sql(Access/Role)DBへのSQLの実行/権限の管理など。
Summary概略報告の出力。
Time現地時刻の算出/差分/XMLレポート。
ToolsDevEnv(Visula StudioのIDE本体)/FxCop(ソースコード規約チェック)/Installshield(インストーラ作成)/NDoc(ドキュメント生成)/NUnit(ユニットテスト)などの操作。
Tools.StrongName厳密な名前付きアセンブリの管理。
VersionNumber「Versionnumber.exe」によるバージョン管理。
VirtualServer(VirtualMachine/VirtualMachine.OS)Virtul Server(仮想サーバ)の管理。
Web.AppPoolIIS 6.0アプリケーションプールの管理。
Web.FtpSiteFTPサーバの管理。
Web.ServiceExtensionIIS 6.0のWeb拡張機能の管理。
Web.SmtpSMTPサーバの管理。
Web.WebSiteWebサイトの管理。
WixWindows Installer XML(Wix)インストーラの操作。
Xml(XmlFile)XMLの操作。
ZipJ# 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"/>

 これによって、外部ライブラリのタスクが利用できるようになります。タスクの利用方法は標準タスクと同様です。タスクごとの詳細な設定については、各ヘルプを参照するとよいでしょう。

ターゲットファイル
 MSBuildでは、一般的によく使用される「アイテム」「プロパティ」「ターゲット」「タスク」の設定を「*.targets」として用意します。このターゲットファイルを使用することで、プロジェクトファイルの保守性と可読性が向上されます。

まとめ

 以上、MSBuildについて紹介してきました。もしかしたら、MSBuildと同様の機能を持つNAntとのどちらを利用するかで悩むことになるかもしれません。

 MSBuildの長所は、Microsoft純正ツールのため.NET Frameworkと共にインストールされることや、正規にサポートされている製品であることが挙げられます。これに対してNAntには、JavaのAntを知っている人や、今後Javaでの開発が想定される開発者には教育負荷が少ないというメリットがあります。また、オープンソースのため、必要があればソースコードを参照できるという特長もあります。両方ともよく利用され、拡張ライブラリの数も着実に増えているので、開発チームのメンバーの状況に合わせて選択するとよいのではないでしょうか。

 それでは、最後にMSBuildについてまとめておきましょう。

  • MSBuildは、多くの作業を自動化することができるビルドツールです。
  • 自動化できる機能としては、Microsoftが提供している標準機能に加え、オープンソースの追加タスクも提供されています。
  • 自動化したい作業をプロジェクトファイルに記述し、「MSBuild.exe」から実行します。
  • プロジェクトファイルは、プロジェクト、アイテムコレクション、プロパティ、ターゲットから構成されます。
  • 条件分岐やエラー制御を行うことができます。

 今回は簡単なサンプルでしたが、実際の開発時には他のさまざまなタスクを組み合わせて効率化を図っていくとよいでしょう。

参考資料

  1. MSDN 『MSBuildの概念
  2. MSDN 『MSBuildリファレンス
  3. NAgile.com
  4. @IT 『MSBuild完全攻略(前編) .NETビルド・エンジン「MSBuild」使いこなし術』 一色政彦 著、2006年4月
  5. @IT 『NAgileで始める実践アジャイル開発~第4回 ミッション:ビルドを自動化セヨ!』 黒石高広 著、2006年9月
  6. Visual Studio MSBuild フォーラム(英語)
  7. The MSBuild Community Tasks Project:英語
  8. Microsoft Services (UK) Enterprise Solutions Build Framework (SBF):英語

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 青木 淳夫(アオキ アツオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/674 2007/04/13 13:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング