前回も書きましたが、インストールとは要するに、アプリケーションソフトをユーザコンピュータの所定の位置に配置して、それを起動するためのショートカットを作ることです。
最初に理解しなければいけないのは、ユーザコンピュータでのフォルダー構造の作成方法と、そのフォルダーに配置するソフトの設定方法です。
フォルダーの構造は、WiXではDirectory 要素を使って定義します。Directoryの定義は特に難しいことはありません。Product 要素の直下、MediaTemplate 要素の次にディレクトリー(Directory)要素を記述します。この要素の必須属性はIdです。
Id属性はDirectory要素に限らず殆どの要素に必須属性で、wxsファイルの中でユニークでなくてはいけません。Name属性はターゲットコンピュータにつけるフォルダー名です。Nameが省略されると、Idがターゲットコンピュータのフォルダー名になります。
システム予約のフォルダー名があります。例を上げます。DesktopFolder、FavoritesFolder、ProgramsFileFolder、ProgramMenuFolder。
Directory 要素はネストすることができます。ネストの深さに制限はありません。
次のXMLはターゲットコンピュータの[ProgramFilesFolder]の下に、[Awesome Software]という名のフォルダーを作り、またメニュー[ProgramMenuFolder]の下に、[ProgramMenuFolder]という名のメニューフォルダーを作っています。
<!--Directory structure--> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="MyProgramDir" Name="Awesome Software" /> </Directory> <Directory Id="ProgramMenuFolder"> <Directory Id="MyShortcutsDir" Name="Awesome Software" /> </Directory> </Directory>
コンポーネントは、当該ディレクトリーに入れるファイルやショートカットを定義します。コンポーネントはDirectory要素の中に直接記述できますが、Directory構造を見やすくするために、別の場所にDirectoryRef 要素を使ってにコンポーネントを定義します。DirectoryRef 要素のId属性は、参照するDirectory 要素のIdです。これでどのDirectory を参照しているかが分かります。
コンポーネントはユニークなGuidが必要です。
コンポーネントの一つはファイルの定義です。下のコードは[InstallMe.txt]ファイルを[MyProgramDir]ディレクトリーに入れています。コンポーネント要素のの中にFile要素を作成して、この中にファイル情報を書きます。一つのコンポーネントの中に複数のファイルを入れることもできますが、アンインストールで削除されない恐れがあるので、基本的にコンポーネントの中には一つだけのファイルを入れ、[KeyPath=”yes”]を宣言しなければいけません。
<!--Components--> <DirectoryRef Id="MyProgramDir"> <Component Id="CMP_InstallMeTXT" Guid="E8A58B7B-F031-4548-9BDD-7A6796C8460D"> <File Id="FILE_InstallMeTXT" Source="InstallMe.txt" KeyPath="yes" /> </Component> </DirectoryRef>
下に、ショートカットの定義を示します。一つのコンポーネントの中に二つのショートカットと[RemoveFolder]、[RegistryValue]を宣言しています。最初のショートカットは[MyProgramDir]にインストールする[InstallMe.txt]にリンクしていますし、二つ目のショートカットは、アンインストールを定義しています。コンポーネントに複数の下位要素がある場合は、どれか一つ最重要な要素に[KeyPath=”yes”]を宣言しなければいけません。
[RemoveFolder]、[RegistryValue]は実はまだよく理解していないのですが、取り敢えずお約束です。ここで使われている角カッコ[MyProgramDir][ProductCode]等は、[プロパティ値]でこの値は、どこかで定義されています。
<!--Start Menu Shortcuts--> <DirectoryRef Id="MyShortcutsDir"> <Component Id="CMP_DocumentationShortcut" Guid="33741C82-30BF-41AF-8246-44A5DCFCF953"> <Shortcut Id="DocumentationStartMenuShortcut" Name="Awesome Software Documentation" Description="Read Awesome Software Documentation" Target="[MyProgramDir]InstallMe.txt" /> <Shortcut Id="UninstallShortcut" Name="Uninstall InstallPractice" Description="Uninstalls Awesome Software" Target="[System64Folder]msiexec.exe" Arguments="/x [ProductCode]" /> <RemoveFolder Id="RemoveMyShortcutsDir" On="uninstall" /> <RegistryValue Root="HKCU" Key="SoftwareMicrosoftAwesomeSoftware" Name="installed" Type="integer" Value="1" KeyPath="yes" /> </Component> </DirectoryRef>
下のコードでは[Feature]は一つだけですが、大きなソフトでは、例えばサンプル集やドキュメント等を別扱いにしたいとき、メインのFeature要素の他に、サンプル集Featureを定義します。Featureの下位要素はComponentRef でここでどのコンポーネントを入れるかを定義しています。
<!--Features--> <Feature Id="ProductFeature" Title="Main Product" Level="1"> <ComponentRef Id="CMP_InstallMeTXT" /> <ComponentRef Id="CMP_DocumentationShortcut" /> </Feature> <UI /> <UIRef Id="WixUI_Minimal" /> </Product> </Wix>