@ledsun blog

無味の味は佳境に入らざればすなわち知れず

WiXのComponentGroupを使う

ComponentGroupの効果

WiXでは次のようにDirectory要素の下に、インストールするコンポーネントを列挙します。 GUIDは、適当に省略してあります。

<Directory Id='TARGETDIR' Name='SourceDir'>
  <Directory Id='ProgramFilesFolder' Name='_'>
    <Directory Id='Hoge' Name='Hoge' FileSource="src\">
      <Component Id="CMP__main.exe" Guid="{xxx}">
        <File Id="File__main.exe" Name="main.exe" />
      </Component>
      <Component Id="CMP__lib.dll" Guid="{xxx}">
        <File Id="File__lib.dll" Name="lib.exe" />
      </Component>
    </Directory>
  </Directory>
</Directory>

定義したコンポーネントは次のように、一つ一つFeatureに登録します。

<Feature Id='Complete' Level='1' >
  <ComponentRef Id='CMP__main.exe' />
  <ComponentRef Id='CMP__lib.dll' />
</Feature>

これがめんどうです。 2つなら良いのですが、10ファイルあるととてもダルいです。

ComponentGroupを使うとコンポーネントをグループ化出来ます。 次のようにFeatureに1つのコンポーネントグループを登録すれば良くなります。 インストールするファイルが増えてもFeatureを変更しなくてよくなります。

<Feature Id='Complete' Level='1' >
  <ComponentGroupRef Id='Hoge' />
</Feature>

ComponentGroupの定義

ComponentGroupはPackage直下に定義します。 Componentの定義もDirectory配下からComponentGroup配下に移動します。

<Directory Id='TARGETDIR' Name='SourceDir'>
  <Directory Id='ProgramFilesFolder' Name='_'>
    <Directory Id='Hoge' Name='Hoge'>
    </Directory>
  </Directory>
</Directory>

<ComponentGroup Id="Hoge" Directory="Hoge" Source="src\">
  <Component Id="CMP__main.exe" Guid="{xxx}">
    <File Id="File__main.exe" Name="main.exe" />
  </Component>
  <Component Id="CMP__lib.dll" Guid="{xxx}">
    <File Id="File__lib.dll" Name="lib.exe" />
  </Component>
</CopmonentGroup>

ComponetGroupにはインストール先のDirectoryと、ファイルを参照するSourceを指定します。 このためDirectoryが異なる場合は、異なるComponentGroupを作る必要があります。

なぜかはわかりませんがDirectoryのIdとComponentGroupのIdが重複しても問題ありません。 たぶん、MSIデータベースのDirectoryテーブルとComponentGroupテーブルのIDカラムがそれぞれユニークであれば問題無いのだと思います。 HTMLの感覚でいると面食らいます。