はじめに
前回は、主にインストーラ作成環境の構築にページを費やしてしまいましたが、今回からいよいよ本格的なインストーラの作成へと移ります。
対象読者
インストーラを必要とするすべての開発者。
必要な環境
前回の記事の公開直前にWiXの新しいビルド(2.0.4221.0)が公開されました。おおむね1ヶ月~2ヶ月に一度くらいのペースで更新が続いていますので、今後も連載中に更新が入ることになると思います。この連載ではUIも扱う都合上、原則的に執筆時点での最新版を利用するつもりでいます。これはUIリソースがまだstable(安定版)扱いにはなっておらず、Technical Preview状態(要するにβ)のためでもあります。そのため、実運用を図る場合においては連載での記述点のみならず、きちんと自身のインストーラに合わせて検証する必要があることも付け加えておきます。また、実際の業務などで利用する場合には、必ずWiXのリリースノートなども参照するようにしてください。
WiXの更新
最新版をダウンロード・展開します。ダウンロード場所などは、前回の記事を参照してください。同じフォルダに展開する場合は、一度以前のファイルを削除してから、展開することをお勧めします(バージョンによってファイルの増減などがあるため)。パスを通している場合は、パスのフォルダを変更するか、同様に以前のものを削除してから新しいものへと更新してください。また、Visual Studioに組み込んでいる場合は、手作業でコピーしたファイルを改めてコピーしてください(無条件コピーでも問題はないと思います)。
インストーラにUIを用意する
前回の記事では、「Readme.txt」をインストールする、ごく小さなインストーラを作成しました。たった1つのファイルをインストールするだけだったとはいえ、Windows Installerの主要機能はほぼすべて網羅していました。とはいえ、味も素っ気もないどころか、何を行っているかの表示すらないインストーラだったため、利用者にとっては不気味以外の何者でもありません。まずは、このインストーラにUIを付けるところからはじめましょう。
インストーラのUIについて
早速、追加したいところですが、その前にWiX 2.0.4221.0で用意されている標準UIを紹介しておきたいと思います。WiX 2.0では「Mondo」「FeatureTree」「Minimal」「InstallDir」という4種類の標準UIシーケンスを用意しています。まだこなれていない部分もあるとは思いますが、軽く紹介しておきます。
UI名 | 略称 | 説明 |
WixUI_Mondo | Mondo | 市販ソフトなどでよく見受けられる、標準、カスタム、すべてのインストール形式を選択できるUIシーケンスです。WiXが標準で用意しているUIとしては最も大がかかりな物となります。 |
WixUI_FeatureTree | FeatureTree | Mondoからインストール形式の選択部分を除外し、常にカスタムインストールが行なわれるようになっている形式です。あまり見かけることはありませんが、インストール時に常に何らかの選択肢を必要とするインストーラなどで使われています。 |
WixUI_Minimal | Minimal | 使用許諾だけが出る、最も少ないUIのインストーラです。カスタムインストールはおろかインストール先の変更もできないため、アドオンなどのようにインストール先の選択が行えないインストーラなどでよく見かけます。 |
WixUI_InstallDir | InstallDir | Minimalにインストール先の変更を行えるようにした形のインストーラです。多くのオンラインソフトや、カスタムインストールを必要としないインストーラで利用されている形式です。Visual Studioのセットアッププロジェクトもこの形式と類似した構成になっています。 |
UIつきインストーラのビルド環境を整える
では、早速インストーラにUIを追加してみましょう。まずは前回のソースコードに、利用するUIを指定します。
<?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi"> <Product ...省略...> <...省略...> </Feature> <!-- ここから追加 --> <UIRef Id="WixUI_ErrorProgressText" /> <UIRef Id="WixUI_Minimal" /> <!-- ここまで追加 --> </Product> </Wix>
前回用意した「MinSrc2.wxs」に追記する形で作られています(ソースの全文は、サンプルを参照してください)。今回はインストーラ自身も単純なものですので、Minimalを利用しています。続いてビルドを行います。
こちらは、前回のように単にファイル名を指定しただけではリンクができません。インストーラでUIを参照するように指定しているため、そのUIを持つライブラリを指定する必要があります。少し面倒ですが、ソースのフォルダに移動し、次のようにコマンドを入力してビルドを実行してください。
C:\WiX\candle.exe MinSrc3.wxs C:\WiX\light.exe MinSrc3.wixobj -out MinSrc3.msi C:\WiX\wixui.wixlib -loc C:\WiX\WixUI_en-us.wxl
実際にインストーラを実行すると、画面1が表示されます。
ようやくインストーラとしての雰囲気が出てきました。とはいえ、ビルドのたびにこのように長いコマンドを入力していたのでは、開発効率が著しく低下してしまいます。これが年に一度あるかどうかならまだしも、開発中でのビルド行為はいわば定型業務のようなものですので、できるだけ効率よくかつ手間のかからない方法を用意しておきたいところです。単一ファイルでのビルドであればプロジェクト管理なども必要ありませんので、上記のコマンドラインをバッチ処理できるようにバッチファイルも用意しておくことにしましょう。
@ECHO OFF REM パラメータチェック IF "%1" == "" GOTO ARG_ERR IF NOT EXIST "%1" GOTO ARG_ERR REM バッチファイル内で作られた環境変数をバッチファイル内に 限定する(ローカル変数と同じ扱いにする) SETLOCAL REM WiX のインストール先を環境変数にして自由に配置できる ようにする(ただし、空白を含むパスには対応していない) IF "%WIXDIR%" == "" SET WIXDIR=C:\WIX REM 出力先フォルダを作成 IF NOT EXIST Obj\. MD Obj IF NOT EXIST Bin\. MD Bin REM 受け取ったファイル名を分解してファイル名だけにする SET FNAME=%~n1 REM コンパイル %WIXDIR%\CANDLE.EXE %FNAME%.wxs -out Obj\ IF ERRORLEVEL 1 GOTO BLD_ERR REM リンク %WIXDIR%\LIGHT.EXE Obj\%FNAME%.wixobj -out Bin\%FNAME%.msi %WIXDIR%\wixui.wixlib -loc %WIXDIR%\WixUI_en-us.wxl IF ERRORLEVEL 1 GOTO BLD_ERR ECHO ビルドが完了しました GOTO END REM 終了処理 :ARG_ERR ECHO ファイルが指定されていないか、ファイルが見つかりません。 GOTO END :BLD_ERR ECHO ビルド中にエラーが発生しました。 :END
先ほどのコマンドラインの代わりにこのバッチファイルを実行すると(「MinSrc3.wxs」以外のファイルを全部削除しておいてもOKです)、同様の処理を一行で行うことができます。また、今までとは異なり、出力ファイルが別フォルダに出力されるようになっているため、管理しやすくなっていると思います。
Express Editionをお使いの方は、少し古いですが『VC++ 2005 Express EditionをWiX用エディタに変身させよう』という記事を公開していますので、こちらを参照してください。また、上記のバッチファイルとは若干異なりますが、サンプルソースに「BuildMSI.cmd」というVisual Studio 2005の外部コマンド対応版のバッチファイルを用意してあります。こちらをツールに登録し、引数を
$(ItemPath)
としておけば、アクティブなファイルをwxsとみなしてビルドすることができます。併せてうまく活用していただければと思います。