How To: インストーラーにファイルを追加する

ファイルをインストールする事は、どんなインストーラーにも最も重要な側面であり、 普通はそもそも これが、インストーラーをビルドしようとする事にたどり着かせるものです。 Windows Installer を使って どのようにファイルを配置するかを学ぶことは、将来の保守性を 確保するのみならず、もし必要なら 後にパッチをビルドする事を可能にする事も、 よい習慣にします。

Step 1: ディレクトリー構造を定義する

インストーラーが 多くのファイルを、ディスク上のいくつかの場所に インストールする為に 持つ事は 良くあります。WiX ファイルの可読性を良くする為に、インストールするファイルの 一覧表を作る前に、まずインストール ディレクトリーを決める事は 良い習慣です。 ディレクトリーは <Directory> エレメントを使って決められ、ターゲットマシンで見たい フォルダーの階層を記述します。以下のサンプルは、アプリケーションのメイン実行ファイルの インストール用ディレクトリーを定義しています。

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="APPLICATIONROOTDIRECTORY" Name="My Application Name"/>
    </Directory>
</Directory>

id TARGETDIR ( TARGETDIR ) を持つエレメントは、Windows Installer に必須であり、インストールの すべてのディレクトリー構造の ルートです。どの WiX プロジェクトも この directory エレメントを持っています。id ProgramFilesFolder を持つ 2番目のエレメントは、ユーザーのマシン上で Program Files フォルダーを参照する為に 定義済み Windows Installer プロパティを使っています。大抵の場合、これは c:\Program Files\ になります。3番目の directory エレメントは、Program Files の下に あなたのアプリケーションの フォルダーを作り、後で WiX プロジェクトで使う為に id APPLICATIONROOTDIRECTORY が与えられています。 その id は、UI か コマンドラインから セットする事ができる パブリック プロパティ ( public property ) にする為に すべて大文字です。

これらのタグの結果は、ターゲットマシン上での c:\Program Files\My Application Name フォルダーです。

Step 2: インストーラー パッケージに ファイルを追加する

ファイルは インストーラーに、2つのエレメントを使って 追加されています: インストールの atomic unit (最小要素のユニット)を指定する <Component> エレメントと、インストールされるべきファイルを指定する <File> エレメントです。

component エレメントは、単一のユニットとしてインストールされる必要のある リソース (通常 ファイル、レジストリー、ショートカット) のセットを 記述します。これは、 ロジカルな feature から構成されるアイテムのセットを、ユーザーが Step 3 で論じられている インストールをする事を 選ぶ事が出来るかどうかとは 別の事です。初めてインストーラーを オーサリングしている時は 重大事には見えないかも知れませんが、後日 パッチを ビルドする事にする時に component はクリティカルな役割を演じます。

一般的に、1つのコンポーネントごとに1つのファイルに制限すべきです。 Windows Installer は、1つのインストーラーで 何千ものコンポーネントをサポートするように デザインされているので、本当にいい理由がない限り、コンポーネントごとに1つのファイルに しておきなさい。どのコンポーネントも、それ自身のユニーク GUID を持って いなければなりません。これら2つの基本ルールに従わない事は、供給する事に なった時に 道に落ちている多くの問題を 導き得るものです。

(訳注: MSDN の インストーラーコンポーネントの定義 Defining Installer Components )を優先して、従って下さい。)

下のサンプルは、2つのファイルをインストールするのに Step 1 で定義された ディレクトリー構造を使っています: アプリケーションの実行ファイルと ドキュメンテーション ファイルです。

<DirectoryRef Id="APPLICATIONROOTDIRECTORY">
    <Component Id="myapplication.exe" Guid="PUT-GUID-HERE">
        <File Id="myapplication.exe" Source="MySourceFiles\MyApplication.exe" KeyPath="yes" Checksum="yes"/>
    </Component>
    <Component Id="documentation.html" Guid="PUT-GUID-HERE">
        <File Id="documentation.html" Source="MySourceFiles\documentation.html" KeyPath="yes"/>
    </Component>
</DirectoryRef>

<DirectoryRef> エレメントは、Step 1 で作成されたディレクトリー構造を 参照するために 使われています。APPLICATIONROOTDIRECTORY ディレクトリーを参照する事によって、ファイルは c:\program files\My Application Name フォルダーに インストールされる でしょう。DirectoryRef は コンポーネント エレメント2つである その下で、インストールされる ファイル それぞれは1つです。これは、ファイルごとに1つのコンポーネントを持つ ベスト プラクティスと調和しています。それぞれのコンポーネント エレメントは、Id と Guid が 与えられています。Id は WiX プロジェクトで、後でコンポーネントを参照するのに 使われています。Guid は、パッチの為に後に使われ、それぞれのコンポーネントについて ユニーク (一意) でなければなりません。GUID を生成するインフォメーションに関しては、 How To: GUID を生成する を見て下さい。

それぞれのコンポーネントがファイル エレメントである 下で、ソースファイルを インストーラーにパッケージする 実際の仕事をします。Id は、WiX プロジェクトで どこかにあるファイルを 参照するのに使われています。Source アトリビュートは、 あなたのマシン上でのファイルの位置を指定しているので、WiX は それを見つけて インストーラーにビルドする事ができます。

KeyPath アトリビュートは Windows Installer に、この個別のファイルは コンポーネントが インストールされているかどうかを 決める為に用いられるべきであると 知らせる為に、 yes にセットされています。1つのコンポーネントごとに1つのファイルを持っている時は、 常に KeyPath アトリビュートを yes にセットすべきです。Checksum アトリビュートは、 ファイル ヘッダーにチェックサム値を持つ (これは一般的に すべての実行可能ファイルについて 真である) 実行可能ファイルに関しては yes にセットされるべきで、Windows Installer によって 再インストールでの ファイルの正当性検証に用いられています。

Step 3: Windows Installer にファイルをインストールする事を知らせる

ディレクトリー構造の定義と インストーラーにパッケージする ファイルの一覧 作成の後、 最終段階は、Windows Installer に 実際にファイルをインストールする事を 知らせる事です。 <Feature> エレメントは これをするために使われていて、インストーラーを、 ユーザーが独立してインストールする事ができる ロジカルなピースに 分割する場所です。 以下の例は、Step 2 から アプリケーションの実行ファイルと ドキュメンテーション ファイルを インストールする 1つの feature を作成しています。

<Feature Id="MainApplication" Title="Main Application" Level="1">
    <ComponentRef Id="myapplication.exe" />
    <ComponentRef Id="documentation.html" />
</Feature>

Feature は、Id が与えられています。もし、feature 選択を含む インストーラー UI シーケンスを 使っているなら、Title アトリビュートは feature 用 UI で表示されるテキストを 含んでいます。 Level アトリビュートは、その feature のインストールを デフォルトで可能にする為に 1 にセットすべきです。

<ComponentRef> エレメントは、Step 2 で作成されたコンポーネントを Id アトリビュート経由で 参照する為に使われています。

完全なサンプル

以下は、上のコンセプトを使用している 完全なサンプルです。この例は、インストーラーを 生成する為に、WiX プロジェクトに挿入、コンパイルや、コマンドラインからコンパイル・リンクする 事ができます。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="1.0.0.0" Language="1033" Name="My Application Name" Manufacturer="My Manufacturer Name">
        <Package InstallerVersion="300" Compressed="yes"/>
        <Media Id="1" Cabinet="myapplication.cab" EmbedCab="yes" />

	<!-- Step 1: ディレクトリー構造を 定義する -->
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="APPLICATIONROOTDIRECTORY" Name="My Application Name"/>
            </Directory>
        </Directory>

	<!-- Step 2: インストーラー パッケージに ファイルを追加する -->
        <DirectoryRef Id="APPLICATIONROOTDIRECTORY">
            <Component Id="myapplication.exe" Guid="PUT-GUID-HERE">
                <File Id="myapplication.exe" Source="MySourceFiles\MyApplication.exe" KeyPath="yes" Checksum="yes"/>
            </Component>
            <Component Id="documentation.html" Guid="PUT-GUID-HERE">
                <File Id="documentation.html" Source="MySourceFiles\documentation.html" KeyPath="yes"/>
            </Component>
        </DirectoryRef>

	<!-- Step 3: WiX にファイルをインストールする事を知らせる -->
        <Feature Id="MainApplication" Title="Main Application" Level="1">
            <ComponentRef Id="myapplication.exe" />
            <ComponentRef Id="documentation.html" />
        </Feature>
    </Product>
</Wix>