Windows Installer XML toolset によるインストーラーの作成

さて、現在作っているアプリをインストールできるように、
インストーラーを作成しているのですが、これがさっぱり分かりません。


ついてくるドキュメントは英語で読みにくいし、ネットを探して出てくるドキュメントも
難解だったりまとまってなかったり。
しょうがないので今回は自分でまとめてみることにしました。


(あぁ、今回はいつものブログとは違ってデスマス調だ。。。微妙にやりにくい)

1.Windows Installer XML toolset の準備


まずは最初に Windows Installer XML toolset をダウンロードしてインストールします。
下記のサイトからダウンロードできます。


http://sourceforge.net/projects/wix/files/


現在は 3.0.5419.0 が最新版なので、こちらをベースに話を進めていきます。
(wix3.0.5419.0-x86-setup.zipをダウンロードしてインストール)


Windows Installer XML toolset をインストールする前に、ProjectAggregator というものを
 インストールしておくと、Visual Studio 2005/2008 Standard Edition 以上の人は
 Visual Studio 内に WiX のプロジェクトが作成できるようになるそうです。
 でもウチのは Visual Studio 2008 Express Edition なんだよね。。。
 ProjectAggregator まで含めた使い方はこちらのサイトが参考になります。


http://yy2.sakura.ne.jp/007_wix/wix.html

Harvest の実行


それでは早速 WiX を使ってみるのですが、まず、作っているプロジェクトからWiXの原型を作ってくれる
Harvest というコマンドがあります。実際のファイル名は heat.exe です。
このプログラムを使用して元となるXMLファイル(拡張子 wxs)を作成します。


以下、HelloWorld プロジェクトでの実行例を記載します。

"C:\Program Files\Windows Installer XML v3\bin\heat.exe" project "HelloWorld.csproj" -pog:Binaries -gg -out HelloWorld.wxs


細かい引数の指定は付属のHelpファイルに書いてあるのですが、
このHelpファイルの中の例は、引数の順番がぬけぬけと間違っていたりします。
プロジェクトファイルの指定は project 引数の直後にして下さい。
以下、簡単に引数の説明です。

引数 説明
project 何を元に WiXXMLファイルを作成するかを決めます。今回はVisualStudioのプロジェクトをベースに作成したので project を指定します。
プロジェクトファイル名 次に元となるプロジェクトファイルのファイル名を記載します。このファイル名は必ず project 引数の直後に記載して下さい。
-pog 実際にインストールする対象が何かを指定します。今回は Binaries を指定しています。
-gg ソフトウェアを一意に識別するGUIDを自動生成します。
-out 出力する XML のファイル名を指定します。直後にファイル名を記載して下さい。


そして、この操作後に以下のような HelloWorld.wxs が生成されます。

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="HelloWorld.Binaries">
            <Component Id="cmp********************************"
             Guid="{********-****-****-****-************}">
                <File Id="fil********************************"
                 Source="$(var.HelloWorld.TargetDir)\HelloWorld.exe" />
            </Component>
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="HelloWorld.Binaries">
            <ComponentRef Id="cmp********************************" />
        </ComponentGroup>
    </Fragment>
</Wix>

wxs ファイルの編集

説明が遅くなりましたが、今回はとりあえず「HelloWorld.exe が Program Files フォルダに
あったら、なんかインストールされったぽくね?」ということで、
exe ファイルを Program Files 以下に置くことを目標にします。


実際のファイル内容の説明については、別ブログで書くとして、
今回はこのようなファイルを作成します。

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Language="1041" UpgradeCode="{********-****-****-****-************}"
     Manufacturer="safsa" Name="HelloWorld" Version="0.1.0.0">
        <Package InstallerVersion="100" />
        <Media Id="1" />
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="HelloWorld.Binaries" Name="HelloWorld" />
            </Directory>
        </Directory>
        <DirectoryRef Id="HelloWorld.Binaries">
            <Component Id="cmp********************************"
             Guid="{********-****-****-****-************}">
                <File Id="fil********************************"
                 Source="bin\Debug\HelloWorld.exe" />
            </Component>
        </DirectoryRef>
        <ComponentGroup Id="HelloWorld.Binaries">
            <ComponentRef Id="cmp********************************" />
        </ComponentGroup>
        <Feature Id="MainApplication" Title="HelloWorld" Level="1">
            <ComponentRef Id="cmp********************************" />
        </Feature>
    </Product>
</Wix>


exe ファイルを debug から持ってきたりと、あやしい動きのところもありますが、
今回はあくまで実験&勉強ということで御容赦を。

candle(コンパイラ)の実行

wxs ファイルが出来上がったら、まずはコンパイラである candle を実行して、
オブジェクトファイルである wixobj ファイルを作成します。
candle は引数なしで実行できます。

"C:\Program Files\Windows Installer XML v3\bin\candle.exe" HelloWorld.wxs


このコマンドが正常に終了したら、 HelloWorld.wixobj というファイルが出来上がります。

リンカの実行と msi ファイルの作成。

ここまできたら、後は light コマンドを使ってリンクと msi ファイルの作成になります。

"C:\Program Files\Windows Installer XML v3\bin\light.exe" -out "HelloWorld.msi" HelloWorld.wixobj


これでフォルダを確認すると、HelloWorld.msi というインストール用のファイルができ上がります。
エクスプローラーで見えない場合は、「最新の情報に更新」を忘れずに。

実際にインストールしてみる。

それでは実際にインストールを行ってみましょう。
作成された HelloWorld.msi を実際に実行してみます。


、、、えーと、なんだか画面にインストールのウィンドウは開いたみたいですが、
何事もなく終わってしまいました。しかし、Program Files を見ると
HelloWorld フォルダに HelloWorld.exe がインストールされていることが分かります。
成功!!


また、プログラムの追加と削除にも当然アプリがでてきますので、
こちらでアンインストールすることもできます。