Patch Creation Properties の使用

パッチは、1つあるいはもっと多くのペアの Windows Installer パッケージの間の 差分を 含んでいます。 Windows SDK 中のツール PatchWiz.dll は、パッケージのペアを比較し、Patch Creation Properties (PCP) ファイルと呼ばれるファイルを使って パッチを作ります。( 訳注: MSDN Windows Installer Development Tools 参照。)

パッチをビルドする為の最新のツールを入手する為に 最新の Windows SDK をダウンロードする事が 推奨されています。

( 訳注: 現在最新の Windows Installer SDK は Windows SDK 7(2009 Aug.) に入っています。ただし こちら 参照。その前は Windows SDK 6.1(2008 Feb.) です。
Platform SDK R2(2006 Mar.) に Windows Installer 3.1 SDK が入っている事を 確認しました。 こちら古い方の場合には、Patchwiz.dll(サンプル フォルダ内) のビルドに Visual C++ などが 必要です。 こちらで必要な環境を確認して、 より新しい Windows SDK を使うか、また同時に お持ちの Visual Studio を使うか Visual C++ Express を試して下さい。)

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

Patch Creation Properties (PCP) ファイルは、PatchWiz.dll に 1つあるいはもっと多くのペアの パッケージでの差分から パッチを生成する事を指示します。パッチは ターゲットと アップグレード パッケージの間の差分を含み、ターゲット パッケージをアップグレード パッケージに 変換します。 ターゲット パッケージとアップグレード パッケージの両方が 下で作られています。

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

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

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 と名付けられた Patch Creation Properties (PCP) オーサリングを作る:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <PatchCreation
        Id="224C316C-5894-4771-BABF-21A3AC1F75FF"
        CleanWorkingFolder="yes"
        OutputPath="patch.pcp"
        WholeFilesOnly="yes"
        >
 
        <PatchInformation 
            Description="Small Update Patch" 
            Comments="Small Update Patch" 
            ShortNames="no" 
            Languages="1033" 
            Compressed="yes" 
            Manufacturer="Dynamo Corp"/>
 
        <PatchMetadata
            AllowRemoval="yes"
            Description="Small Update Patch"
            ManufacturerName="Dynamo Corp"
            TargetProductName="Sample"
            MoreInfoURL="http://www.dynamocorp.com/"
            Classification="Update"
            DisplayName="Sample Patch"/>
 
        <Family DiskId="5000"
            MediaSrcProp="Sample" 
            Name="Sample"
            SequenceStart="5000">
            <UpgradeImage SourceFile="C:\sample\1.1\admin\product.msi" Id="SampleUpgrade">
                <TargetImage SourceFile="C:\sample\1.0\admin\product.msi" Order="2"      
                    Id="SampleTarget" IgnoreMissingFiles="no" />
            </UpgradeImage>
        </Family>
 
        <PatchSequence PatchFamily="SamplePatchFamily"
            Sequence="1.0.0.0"
            Supersede="yes" />
 
    </PatchCreation>
</Wix>

SequenceStart は、ターゲット パッケージの File テーブルでの最後のシーケンスより 大きいものでなければならず、さもないと パッチはインストールされない 事に注意して下さい。

2.ターゲットをビルドして パッケージをアップグレードする

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

ターゲット パッケージをビルドする

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

ターゲット パッケージの管理インストールを行う

管理インストールを行うのに Msiexec.exe が使用されていますが、実際には システムには 何も登録されていません。主にファイルの展開です。

msiexec.exe /a 1.0\product.msi /qb TARGETDIR=C:\sample\1.0\admin

アップグレード パッケージをビルドする

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

アップグレード パッケージの管理インストールを行う

msiexec.exe /a 1.1\product.msi /qb TARGETDIR=C:\sample\1.1\admin

3.パッチをビルドする

Patch.wxs ファイルは PCP ファイルにコンパイルされ、そして、それは パッチ パッケージを 作るのに MsiMsp.exe によって処理されています。

candle.exe patch.wxs
light.exe patch.wixobj -out patch\patch.pcp
msimsp.exe -s patch\patch.pcp -p patch\patch.msp -l patch.log

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" を選んで、削除ボタンをクリックします。

制限

パッチインストールの間 問題を避けるには パッチはどのようにビルドされていなければならないか における 制限を再検討して下さい。