WiX v3.0/v3.5 プチ チュートリアル

WiX 記事一覧


WiXWindows Installer でアプリケーションをインストールすることができる msi ファイルを作成するためのオープンソースツール。
wxs(Windows Installer XML source file) という XML ファイルを書いて、WiX に含まれるツールでコンパイル&リンクすることで msi ファイルが生成される。


WiXコマンドラインから用いるか、Visual Studio に組み込んで使う。
チュートリアルwsx を手作業で作成し、コマンドラインからコンパイル&リンクする手順で説明している。

  • チュートリアルで使うツールは candle と light の2つ。
    • candle.exe : コンパイラWiX Source ファイル(.wxs) をコンパイルして WiX Object ファイル(.wixobj) を生成する
    • light.exe : リンカ。WiX Object ファイルと、必要とするリソースをひとまとめにして .msi ファイルを生成する。
  • インストールするファイルを作成(中身はダミーでOK)
    • test_product/app/test.exe : %ProgramFiles%\test_product\ にインストール
    • test_product/data/test.data : %ProgramData%\test_product\ にインストール
    • %ProgramData% は Vista 以降と XP/2003 以前で異なる

WiX Source ファイルを記述

まずは空のインストーラを作ってみる。
test.wxs として次を保存。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product
        Id="a52608a3-9a98-4a25-9c9c-209bc5e72f70"
        UpgradeCode="a52608a3-9a98-4a25-9c9c-209bc5e72f70"
        Name="TEST PRODUCT"
        Version="1.00.0000"
        Manufacturer="me"
        Language="1041"
    >
        <Package Id="*" Compressed="yes" InstallerVersion="400" />

    </Product>
</Wix>

この例では Product も Package も最小限の属性のみ記述してある。
実際には Package にはパッケージのサマリー(コントロールパネルの「プログラムの追加と削除」に表示される説明)などを記述する。
この状態からでも一応 msi を生成することができる。

> candle.exe test.wxs
  • リンク。
> light.exe test.wixobj

これで test.msi が生成されるが、もちろん開いても正しく動かない。


ここから test_product のインストーラを構成していく記述を追加していく。

        <Media Id="1" Cabinet="test.cab" EmbedCab="yes" />

インストーラを複数ファイルで構成できるようにするための指定。
現在では1ファイル完結以外の配布形態をとることはほとんどないだろうが、Media を省略すると warning となるので、記述しておく必要がある。

        <UIRef Id="WixUI_Minimal" />

最小構成での例なので、WiX に付属している UI(ウィザード) のうち一番小さい WixUI_Minimal (ライセンスの確認のみ)を使用する。
ライセンスとして表示されるドキュメントはリッチテキストファイルなどで作成すれば自由なものに置き換え可能だが、ここでは省略。


なお、WixUI_Minimal のような WiX の UI Dialog を使う場合は light.exe でリンクするときに -ext WixUIExtension を指定する必要がある。

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="myappdir" Name="test_product">
                </Directory>
            </Directory>
            <Directory Id="CommonAppDataFolder">
                <Directory Id="mydatadir" Name="test_product">
                </Directory>
            </Directory>
        </Directory>

ディレクトリ構成を記述する。
Directory のルート要素については、 Id="TARGETDIR" かつ Name="SourceDir" を指定する必要がある(この要素は「インストール先のディレクトリ」に対応するものではない)。


Id="ProgramFilesFolder" は %ProgramFiles% に、Id="CommonAppDataFolder" は %ProgramData% に対応する。OS が 32ビットか 64ビットか、Vista 以降かそうでないかによって、これらの指す値は適宜変わって、適切な場所にインストールされる。


アプリケーションをインストールする先のディレクトリを <Directory Id="myappdir" Name="test_product"> や <Directory Id="mydatadir" Name="test_product"> のように記述する。
Id は次の Component 要素から参照するので、重複しないようにつける。

        <Component Guid="84d0a8a1-1bb5-4a45-ba1e-36a4f604f095" Id="myapp" Directory="myappdir">
            <File Id="test.exe" Name="test.exe" Source="test_product/app/test.exe" />
        </Component>
        <Component Guid="44f74312-6a58-4ce7-8059-95bb140dac89" Id="mydata" Directory="mydatadir">
            <File Id="test.data" Name="test.data" Source="test_product/data/test.data" />
        </Component>

インストールするファイルを指定する。
Component 要素の Directory 属性に、設置先の Directory 要素の Id を指定する。

  • Guid は適切に生成したものをコンポーネントごとに指定する。
  • Guid は省略もできるが、その場合、「ファイルの復元」「アンインストールによる削除」ができなくなる。


ファイルに限らず、インストーラによって配置される全てのリソースはこの Component 要素によって記述する。

ただし、それらディレクトリとはまったく関係ないリソースの場合にも Directory 属性の指定は必須なので、それらのリソースの Component には TARGETDIR を指定しておけばよい。


Component は Directory 要素の直下に書くこともできる。その場合は Directory 属性の指定を省略できる(親の Directory 要素が指定された、と解釈される)。

        <Feature Id="feature1" Level="1">
            <ComponentRef Id="myapp" />
            <ComponentRef Id="mydata" />
        </Feature>

Feature はインストール構成を選択可能にする仕組み(「最小」「全体」を選ばせたり、「カスタム」でコンポーネントごとに要不要を指定、など)。
インストールする全ての Component は必ず少なくとも1つの Feature によって参照されている必要がある(忘れるとコンパイル時にエラー)。
特に選択させる必要が無い場合は、例のように、全ての Component を1つの Feature から参照させておけばよい。


ここまでの手順をまとめると次の .wxs ファイルが完成する。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product
        Id="a52608a3-9a98-4a25-9c9c-209bc5e72f70"
        UpgradeCode="a52608a3-9a98-4a25-9c9c-209bc5e72f70"
        Name="TEST PRODUCT"
        Version="1.00.0000"
        Manufacturer="me"
        Language="1041"
    >
        <Package Id="*" Compressed="yes" InstallerVersion="400" />
        <Media Id="1" Cabinet="test.cab" EmbedCab="yes" />
        <UIRef Id="WixUI_Minimal" />

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="myappdir" Name="test_product">
                </Directory>
            </Directory>
            <Directory Id="CommonAppDataFolder">
                <Directory Id="mydatadir" Name="test_product">
                </Directory>
            </Directory>
        </Directory>

        <Component Guid="84d0a8a1-1bb5-4a45-ba1e-36a4f604f095" Id="myapp" Directory="myappdir">
            <File Id="test.exe" Name="test.exe" Source="test_product/app/test.exe" />
        </Component>
        <Component Guid="44f74312-6a58-4ce7-8059-95bb140dac89" Id="mydata" Directory="mydatadir">
            <File Id="test.data" Name="test.data" Source="test_product/data/test.data" />
        </Component>

        <Feature Id="feature1" Level="1">
            <ComponentRef Id="myapp" />
            <ComponentRef Id="mydata" />
        </Feature>

    </Product>
</Wix>


先ほどと同じようにコンパイル&リンクすれば .msi ファイルができる。
ただし、 WixUI_Minimal を利用しているので、 light.exe に WixUIExtension を使うように指定する必要がある。

> light.exe -ext WixUIExtension test.wixobj

WiX 記事一覧