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の感覚でいると面食らいます。