Torch.exe と Pyro.exe と呼ばれるツールを使って WiX だけで パッチを作る事ができます。 これらのツールの使用は、管理インストールを行う必要や、大きなプロダクトでは心身を 疲れさせ得る アップグレードプロダクトを バインドする必要さえ なくします。
サンプル プロダクトが作られ、異なるリソースを fragment に置いています。各フラグメントの 中のリソースは パッチの外に取除かれ得るように、リソースを個別のフラグメントの中に 置きます。もし プロダクトの一部だけをアップデートするのに パッチを制限するなら、いくつかの リソースを パッチの外に取除くかもしれません。
サンプルを実行するつもりのディレクトリーを作る。これは サンプルのルートになります。
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 と名付けられた パッチ オーサリングを作る:
<?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>
コマンド プロンプトを開いて、以下の 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
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
パッチが働く事を実証するため、プロダクトとパッチをインストールします。
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" を選んで、削除ボタンをクリックします。
正しくインストールとアンインストールするには パッチの中に何が在り得るか についての 制限に加えて、以下の制限は パッチが正しく働く事を 保証します。
パッチファミリーは、パッチで最後となるべき リソースをフィルターするのに使われています。 ひとたび パッチが作成されると、これらのパッチファミリーは どのパッチが取って代わられるかを 左右します。もし 新しいパッチでパッチファミリーからリソースが削除されて 同じパッチ ファミリーの古いパッチに そのリソースが含まれていると、古いパッチが取って代わられた時に、 古いパッチがインストールされる前の 以前の状態に逆戻りします。
あるパッチが 別のパッチに取って代わるために、すべてのパッチファミリーが 取って代わられ なければならない事に 注意して下さい。上の例では 平易さの為に 単一のパッチファミリーが 載せられています。
もし パッチがアンインストール可能であるべき ならば、 制限で参照されている 追加や変更できない 一定の エレメントがあります。もし Patch/@AllowRemoval が "yes" にセットされて これらのどれかの エレメントが 追加か変更されていると、Pyro.exe は エラーを返します。これらのエレメントは、 Windows Installer がパッチで制限しているテーブルにコンパイルし、それで WiX は、パッチが アンインストール可能であって欲しい時にアンインストール可能ではないと 知らせて パッチの 作成を妨げます。