プロジェクト

全般

プロフィール

WiX Writing

WiXの構成要素

WiXは、インストーラー構成情報をXMLで記述し、コマンドにかけてMSI形式のインストーラーを生成します。

WiX XMLの要素ツリー

Wix
  +-- Product
        +-- Package
        +-- MajorUpgdade
        +-- MediaTemplate †1
        +-- Directory
        :     +-- Directory
        :     :
        +-- ComponentGroup †2
        :     +-- Component
        :     :     +-- File
        +-- Feature
  • †1 インストーラーを複数の物理ディスクに分割する場合はMediaTemplate要素ではなくMedia要素を使う
  • †2 ファイル要素を持つComponent要素をComponentGroup要素で定義する場合

Wix要素

T.B.D.

Package要素

T.B.D.

MajorUpdate要素

バージョンアップを可能にします。上位のProduct要素にUpgradeCode属性とVersion属性が定義されている必要があります。

MediaTemplate要素

T.B.D.

Directory要素

インストーラーがインストールする対象ディレクトリとその下のディレクトリ構造を定義します。

例1) C:\Program Files\Hello にインストール

C:\Program Files\Hello にインストールする場合のDirectory要素は次のようになります。

<Directory Id="TARGETDIR" Name=SourceDir">
    <Directory Id="ProgramFilesFolder" Name="InstallDir">
        <Directory Id="MyProgramDir" Name="Hello" />
    </Directory>
</Directory>
  • トップのDirectory要素は、Id属性にTARGETDIRを指定し、Name属性にSourceDirを指定します。TARGETDIRはインストール先のルートディレクトリを定義し、典型的には C:\ となります。
  • 2番目のDirectory要素は、Id属性にProgramFilesFolderを指定していますが、これは事前定義名で、C:\Program Filesとなります。
  • 3番目のDirectory要素は、Id属性に任意の(事前定義名ではない)文字列を指定し、実際に作成されるディレクトリ名はName属性に指定した名前となります。

例2) スタートメニュー(プログラムメニュー)にショートカット

Windowsのスタートメニュー(プログラムメニュー)にショートカットを作成するために、ショートカットの場所をDirectory要素で指定します。
例1で作成した構造に、スタートメニュー用のディレクトリ要素を追加します。

 <Directory Id="TARGETDIR" Name=SourceDir">
     <Directory Id="ProgramFilesFolder" Name="InstallDir">
         <Directory Id="MyProgramDir" Name="Hello" />
     </Directory>
+    <Directory Id="ProgramMenuFolder">
+        <Directory Id="MyShortcutDir" Name="My Company" />
+    </Directory>
 </Directory>

Component要素

インストーラーがインストールするそれぞれのファイルは、すべてComponent要素で定義します。

例1) C:\Program Files\Hello\hello.txt ファイルの定義

<Component Id="CMP_helloTxt" Guid="12345678-9ABC-DEF0-1234-567890ABCDEF">
    <File Id="FILE_MyProgramDir_helloTXT" Source="hello.txt" KeyPath="yes" />
</Component>
  • Component要素のId属性は分かりやすい且つ識別しやすい名前を指定します。ここでは、Component要素であることを示す接頭辞 CMP_と子要素のファイル名にちなんだhelloTXTを結合した名前を指定してみました。
  • Component要素の属性Guidで固有のGUIDを指定します。
  • Component要素の子要素にFile要素を指定し、インストールするファイルを定義します。Source属性でインストーラー作成時に対象ファイルがあるパスを、カレントディレクトリからの相対パスまたは絶対パスで指定します。
  • File要素のKeyPath属性を指定することで、インストーラーの「修復」インストールでファイルを再度インストールすることが可能となります。そのためには、Component要素の子要素には1つだけFile要素を指定することになります。

Component要素の指定場所

Component要素は、そのコンポーネント(ファイル等)をインストールするディレクトリに紐づけます。
紐づけには3つの方法があります。

方法1) Directory要素の子要素にComponent要素を指定

ファイルをインストールするディレクトリに対応するDirectory要素の子要素にComponent要素を指定します。

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="MyProgramDir" Name="Hello">
            <Component Id="CMP_helloTXT" Guid="12345678-9ABC-DEF0-1234-567890ABCDEF">
                <File Id="FILE_MyProgramDir_helloTXT" Source="hello.txt" KeyPath="yes" />
            </Component>
        </Directory>
    </Directory>
</Directory>

この書き方は、インストールするファイルが多数ある場合、Directory要素のツリーが複雑になるため、あまり推奨されません。

方法2) DirectoryRef要素の子要素にComponent要素を指定
<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="MyProgramDir" Name="Hello" />
    </Directory>
</Directory>

<DirectoryRef Id="MyProgramDir">
    <Component Id="CMP_helloTXT" Guid="12345678-9ABC-DEF0-1234-567890ABCDEF">
        <File Id="FILE_MyProgramDir_helloTXT" Source="hello.txt" KeyPath="yes" />
    </Component>
</DirectoryRef>

DirectoryRef要素のId属性には、インストールするファイルを配置するディレクトリのId属性と同じId属性を記述します。

方法3) ComponentGroup要素の子要素にComponent要素を指定
<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="MyProgramDir" Name="Hello" />
    </Directory>
</Directory>

<ComponentGroup Id="ProductComponents" Directory="MyProgramDir">
    <Component Id="CMP_helloTXT" Guid="12345678-9ABC-DEF0-1234-567890ABCDEF">
        <File Id="FILE_MyProgramDir_helloTXT" Source="hello.txt" KeyPath="yes" />
    </Component>
</ComponentGroup>

ComponentGroupのDirectory属性には、インストールするファイルを配置するディレクトリのId属性の名前を記述します。

方法2のDirectoryRef要素を使う場合は、後に説明するFeature要素の子要素にComponent要素の数分だけComponentRef要素を記述しなければなりません。
この方法では、Feature要素の子要素にComponentGroupRefを指定できるので、多数のComponent要素がある場合はこの方法が簡潔になります。

File要素

  • Source属性は必須
  • Id属性は省略可。Id属性を省略した場合は、ファイル名がIdとして使われる。
  • Name属性は省略可。明示的に指定するとインストール時にその名前でファイルがインストールされる。つまりインストール時にファイル名を変更できる。
  • KeyPath属性を省略すると、Component要素の子要素のFile要素のうち最初のものがKeyPathファイルとして扱われる。つまり、Component要素の子要素に1つだけFile要素を指定すると、すべてのファイルがKeyPathとして扱われる。

Feature要素

インストール時に、インストールする機能をユーザーが選択できるようにする場合に使用します。

<Feature Id="MainProduct" Title="Main Product" Level="1">
    <ComponentRef Id="CMP_AppEXE" />
    <ComponentRef Id="CMP_Doc" />
    <ComponentRef Id="CMP_StartMenuSHortcuts" />
</Feature>

<Feature Id="OptionalTools" Title="Optional Tools" Level="1">
    <ComponentRef Id="CMP_ToolsEXE" />
</Feature>

Fragment要素

XML記述を複数のファイルに分割する場合に使用します。

Shortcut要素

インストール時にショートカットを作成する場合に使用します。
典型的には、スタートメニューに追加するショートカットがあります。

例1) スタートメニュー(プログラムメニュー)にショートカット

<DirectoryRef Id="MyShortcutDir">
    <Component Id="CMP_ProgramShortcut" Guid="12345678-9ABC-DEF0-1234-567890ABCDEF">
        <Shortcut Id="ProgramStartMenuShortcut" 
                  Name="My Program" 
                  Description="Start My Program" 
                  Target="[MyProgramDir]MyProgram.exe" />
    </Component>
</DirectoryRef>

Feature要素の子要素にComponentRefを追加します。

<Feature>
    :
    <ComponentRef Id="CMP_ProgramShortcut" />

これでインストール時にスタートメニューにショートカットが追加されます。
ただし、アンインストール時にショートカットが削除されないので追加記述が必要です。

例2) スタートメニューにショートカット(アンインストール対応)

 <DirectoryRef Id="MyShortcutDir">
     <Component Id="CMP_ProgramShortcut" Guid="12345678-9ABC-DEF0-1234-567890ABCDEF">
         <Shortcut Id="ProgramStartMenuShortcut" 
                   Name="My Program" 
                   Description="Start My Program" 
                   Target="[MyProgramDir]MyProgram.exe" />
+        <RemoveFolder Id="RemoveMyShortcutDir" On="uninstall" />
+        <RegistryValue Root="HKCU" Key="Software\[Manifucturer]\[ProductName]" 
+                       Name="installed" Type="integer" Value="1" KeyPath="yes" />
     </Component>
 </DirectoryRef>
  • RemoveFolder要素でスタートメニューの中に作成したサブフォルダをアンインストール時に削除します。
  • RegistryValue要素は、Shortcut要素がKeyPath属性を持てないために補う要素です。

例3) アンインストール用ショートカット

        <Shortcut Id="ProgramStartMenuShortcut" ...
        <Shortcut Id="UninstallShortcut" 
                  Name="Uninstall My Program" 
                  Description="Uninstalls My Program and all of its components" 
                  Target="[System64Folder]msiexec.exe" 
                  Arguments="/x [ProductCode]" />

ユースケース別

64bitバイナリをインストールする