純粋に WiX を使用

Torch.exe と Pyro.exe と呼ばれるツールを使って WiX だけで パッチを作る事ができます。 これらのツールの使用は、管理インストールを行う必要や、大きなプロダクトでは心身を 疲れさせ得る アップグレードプロダクトを バインドする必要さえ なくします。

1.Sample をセットアップする

サンプル プロダクトが作られ、異なるリソースを fragment に置いています。各フラグメントの 中のリソースは パッチの外に取除かれ得るように、リソースを個別のフラグメントの中に 置きます。もし プロダクトの一部だけをアップデートするのに パッチを制限するなら、いくつかの リソースを パッチの外に取除くかもしれません。

サンプルを収容するディレクトリーを作る

サンプルを実行するつもりのディレクトリーを作る。これは サンプルのルートになります。

md C:\sample

サブディレクトリーを2つ作る

サンプル ルートの下で "1.0" と "1.1" と名付けられた サブディレクトリーを2つ作る。

md C:\sample\1.0
md C:\sample\1.1

1.0 の為に Sample.txt と名付けられた テキストファイルを作る

"1.0" ディレクトリーの中で Sample.txt と名付けられた テキストファイルを作り、その中に それが 1.0 バージョンのファイルであると 知らせるテキストを いくつか置く。

echo This is version 1.0 > C:\sample\1.0\Sample.txt

1.1 の為に Sample.txt と名付けられた テキストファイルを作る

"1.1" ディレクトリーの中で Sample.txt と名付けられた テキストファイルを作り、その中に それが 1.1 バージョンのファイルであると 知らせるテキストを いくつか置く。

echo This is version 1.1 > C:\sample\1.1\Sample.txt

サンプル ルート フォルダーで プロダクト オーサリングを作る

サンプル ルート フォルダーで、以下の内容で Product.wxs と名付けられたプロダクト オーサリングを作る:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="48C49ACE-90CF-4161-9C6E-9162115A54DD"
        Name="WiX Patch Example Product"
        Language="1033"
        Version="1.0.0"
        Manufacturer="Dynamo Corporation"
        UpgradeCode="48C49ACE-90CF-4161-9C6E-9162115A54DD">
        <Package Description="Installs a file that will be patched."
            Comments="This Product does not install any executables"
            InstallerVersion="200"
            Compressed="yes" />
 
        <Media Id="1" Cabinet="product.cab" EmbedCab="yes" />
        <FeatureRef Id="SampleProductFeature"/>
    </Product>
 
    <Fragment>
        <Feature Id="SampleProductFeature" Title="Sample Product Feature" Level="1">
            <ComponentRef Id="SampleComponent" />
        </Feature>
    </Fragment>
 
    <Fragment>
        <DirectoryRef Id="SampleProductFolder">
            <Component Id="SampleComponent" Guid="{C28843DA-EF08-41CC-BA75-D2B99D8A1983}" DiskId="1">
                <File Id="SampleFile" Name="Sample.txt" Source=".\$(var.Version)\Sample.txt" />
            </Component>
        </DirectoryRef>
    </Fragment>
 
    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder" Name="PFiles">
                <Directory Id="SampleProductFolder" Name="Patch Sample Directory">
                </Directory>
            </Directory>
        </Directory>
    </Fragment>
</Wix>

サンプル ルート フォルダーで パッチ オーサリングを作る

サンプル ルート フォルダーで、以下の内容で Patch.wxs と名付けられた パッチ オーサリングを作る:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Patch 
        AllowRemoval="yes"
        Manufacturer="Dynamo Corp" 
        MoreInfoURL="http://www.dynamocorp.com/"
        DisplayName="Sample Patch" 
        Description="Small Update Patch" 
        Classification="Update"
        >
 
        <Media Id="5000" Cabinet="RTM.cab">
            <PatchBaseline Id="RTM"/>
        </Media>
 
        <PatchFamilyRef Id="SamplePatchFamily"/>
    </Patch>
 
    <Fragment>    
        <PatchFamily Id='SamplePatchFamily' Version='1.0.0.0' Supersede='yes'>
            <ComponentRef Id="SampleComponent"/>
        </PatchFamily>
    </Fragment>
</Wix>

2.パッチ Sample をビルドする

コマンド プロンプトを開いて、以下の WiX のツールが パスの中にある事を 確認して下さい。

WiX toolset のバージョンは、少なくとも 3.0.3001.0 であるべきです。

ターゲット レイアウトをビルドする

.wixout だけが必要とされているけれど、パッチのインストールをテストするのに ターゲット プロダクト レイアウトが作成されています。プロダクトは、パッチの前や 一緒にもインストールされるべきです。

cd C:\sample
candle.exe -dVersion=1.0 product.wxs
light.exe product.wixobj -out 1.0\product.msi

アップグレード レイアウトをビルドする

candle.exe -dVersion=1.1 product.wxs
light.exe product.wixobj -out 1.1\product.msi

プロダクト間のトランスフォームを作成する

torch.exe -p -xi 1.0\product.wixpdb 1.1\product.wixpdb -out patch\diff.wixmst

3.パッチをビルドする

patch.wxs ファイルはコンパイルされ プロダクトのようにリンクされますが、パッチに 収容したいトランスフォームの数だけと一緒に 処理されています。それは、フィルタリングの後 トランスフォームが作成されたものから どのプロダクトもターゲットとする MSP ファイルを 作ります。

candle.exe patch.wxs
light.exe patch.wixobj -out patch\patch.wixmsp
pyro.exe patch\patch.wixmsp -out patch\patch.msp -t RTM patch\diff.wixmst

4.パッチをベリファイする

パッチが働く事を実証するため、プロダクトとパッチをインストールします。

1.0 プロダクトをインストールする

msiexec.exe /i 1.0\product.msi /l*vx install.log

バージョン 1.0 をベリファイする

"Program Files\Patch Sample Directory" に行き、Sample.txt を開く。 これが 1.0 バージョンである事を確かめ、Sample.txt を閉じる。

パッチをインストールする

msiexec.exe /p patch\patch.msp /l*vx patch.log

バージョン 1.1 をベリファイする

"Program Files\Patch Sample Directory" に行き、Sample.txt を開く。 これが今 1.1 バージョンである事を確かめ、Sample.txt を閉じる。

パッチを アンインストールする

Windows XP Service Pack 2 と Windows Server 2003 では、コントロールパネルの 「プログラムの追加と削除」に行き「更新プログラムの表示」にチェックが入っている事を 確認する。Windows Vista 以降では、コントロールパネルの「プログラムと機能」そして 「インストールされた更新プログラム」に行く。"WiX Patch Example Product" の下から "Sample Patch" を選んで、削除ボタンをクリックします。

"Program Files\Patch Sample Directory" に行き、Sample.txt を開く。 これが再び 1.0 バージョンである事を確かめ、Sample.txt を閉じる。

プロダクトを アンインストールする

Windows XP Service Pack 2 と Windows Server 2003 では、コントロールパネルの 「プログラムの追加と削除」に行く。Windows Vista 以降では、コントロールパネルの 「プログラムと機能」そして「プログラムのアンインストール」に行く。 "WiX Patch Example Product" を選んで、削除ボタンをクリックします。

制限

正しくインストールとアンインストールするには パッチの中に何が在り得るか についての 制限に加えて、以下の制限は パッチが正しく働く事を 保証します。

パッチ ファミリーは 成長(増大)だけできる

パッチファミリーは、パッチで最後となるべき リソースをフィルターするのに使われています。 ひとたび パッチが作成されると、これらのパッチファミリーは どのパッチが取って代わられるかを 左右します。もし 新しいパッチでパッチファミリーからリソースが削除されて 同じパッチ ファミリーの古いパッチに そのリソースが含まれていると、古いパッチが取って代わられた時に、 古いパッチがインストールされる前の 以前の状態に逆戻りします。

あるパッチが 別のパッチに取って代わるために、すべてのパッチファミリーが 取って代わられ なければならない事に 注意して下さい。上の例では 平易さの為に 単一のパッチファミリーが 載せられています。

あるエレメントは アンインストール可能なパッチに 追加する事ができない

もし パッチがアンインストール可能であるべき ならば、 制限で参照されている 追加や変更できない 一定の エレメントがあります。もし Patch/@AllowRemoval が "yes" にセットされて これらのどれかの エレメントが 追加か変更されていると、Pyro.exe は エラーを返します。これらのエレメントは、 Windows Installer がパッチで制限しているテーブルにコンパイルし、それで WiX は、パッチが アンインストール可能であって欲しい時にアンインストール可能ではないと 知らせて パッチの 作成を妨げます。