パッチは、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 を試して下さい。)
Patch Creation Properties (PCP) ファイルは、PatchWiz.dll に 1つあるいはもっと多くのペアの パッケージでの差分から パッチを生成する事を指示します。パッチは ターゲットと アップグレード パッケージの間の差分を含み、ターゲット パッケージをアップグレード パッケージに 変換します。 ターゲット パッケージとアップグレード パッケージの両方が 下で作られています。
サンプルを実行するつもりのディレクトリーを作る。これは サンプルのルートになります。
md C:\sample
サンプル ルートの下で "1.0" と "1.1" と名付けられた サブディレクトリーを2つ作る。
md C:\sample\1.0 md C:\sample\1.1
"1.0" ディレクトリーの中で Sample.txt と名付けられた テキストファイルを作り、 その中に それが 1.0 バージョンのファイルであると 知らせるテキストを いくつか置く。
echo This is version 1.0 > C:\sample\1.0\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 テーブルでの最後のシーケンスより 大きいものでなければならず、さもないと パッチはインストールされない 事に注意して下さい。
コマンド プロンプトを開いて、以下の 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
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
パッチが働く事を実証するため、プロダクトとパッチをインストールします。
msiexec.exe /i 1.0\product.msi /l*vx install.log
"Program Files\Patch Sample Directory" に行き、Sample.txt を開く。 これが 1.0 バージョンである事を確かめ、Sample.txt を閉じる。
msiexec.exe /p patch\patch.msp /l*vx patch.log
"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" を選んで、削除ボタンをクリックします。
パッチインストールの間 問題を避けるには パッチはどのようにビルドされていなければならないか における 制限を再検討して下さい。