WiX Toolset – Directory と Component

前回も書きましたが、インストールとは要するに、アプリケーションソフトをユーザコンピュータの所定の位置に配置して、それを起動するためのショートカットを作ることです。

最初に理解しなければいけないのは、ユーザコンピュータでのフォルダー構造の作成方法と、そのフォルダーに配置するソフトの設定方法です。

フォルダーの構造は、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>
error: コピーできません !!