私は、当社のために維持しているInstallShield 2012BasicMSIプロジェクトを持っています。私は訓練を受けたInstallShield開発者ではありませんが(トーテムポールで[当時]最低でした)、バージョン間ですべてがスムーズに実行されるように、数か月にわたって十分に習得しました。
最近、お客様の1人が、最新リリースですでに修正されている古いバージョンの製品のバグを修正すると主張しました。フルインストーラーがアップデーターを兼ねているため、通常はパッチを作成しませんが、この場合は、準拠して、現在のバージョンでブランチを作成し、更新パッチを送信しました。そのパッチには1つのファイルしか含まれておらず、置き換えたファイルと同じバージョンでした。すべてが順調でした。
今日、そのお客様は最新バージョンへのアップグレードを希望しています。事実上、ブランチをメインラインにマージしています。ブランチには追加のコンポーネントやクライアント固有のコードがないため、通常のインストーラーを提供するだけで、すべてを上書きできると思いました。そうではない...
分岐インストールを複製してファイルを更新しようとすると、インストーラーは正常に実行され、分岐dll以外のすべてが置き換えられます。「omus」、「amus」、強制上書きなどをいじくり回しても何も変わりません。事前にファイルを削除しても何も起こりません。私が何を試しても、分岐したdllは残り、ログは次のようになります(有罪を保護するために名前が変更され、バージョンとGUIDはそのまま残されます):
正しく更新されるDLL:
Executing op: RegisterSharedComponentProvider(,,File=dll_that_works.r1,Component={B4F132E0-6C2A-4138-990B-16B991F8C54D},ComponentVersion=1.1.1.195,ProductCode={B2F1D6AC-95A4-44A9-9A52-631A3AD14389},ProductVersion=1.1.1,PatchSize=0,PatchAttributes=0,PatchSequence=0,SharedComponent=0,IsFullFile=0)
Executing op: FileCopy(SourceName=SY2F9C~1.DLL|dll_that_works.dll,SourceCabKey=dll_that_works.r1,DestName=dll_that_works.dll,Attributes=16384,FileSize=51584,PerTick=65536,,VerifyMedia=1,,,,,CheckCRC=0,Version=1.1.1.195,Language=0,InstallMode=130023424,,,,,,,)
File: C:\inetpub\wwwroot\Service\bin\dll_that_works.dll; Overwrite; Won't patch; REINSTALLMODE specifies all files to be overwritten
Source for file 'dll_that_works.r1' is compressed
更新されない分岐DLL:
Executing op: SetSourceFolder(Folder=C:\Windows\Installer\$PatchCache$\Managed\CA6D1F2B4A599A44A92536A1A31D3498\1.1.1)
Executing op: RegisterSharedComponentProvider(PatchGUID={EC6657A6-01A1-4AFC-86F9-1F4BF5F15481},MediaCabinet=#PCW_CAB_Family1,File=branched_dll.r,Component={74531F91-82A9-421D-A227-15DDDEDFC2FA},ComponentVersion=1.1.1.195,ProductCode={B2F1D6AC-95A4-44A9-9A52-631A3AD14389},ProductVersion=1.1.1,PatchSize=35952,PatchAttributes=0,PatchSequence=10000,SharedComponent=0,IsFullFile=0)
Executing op: FileCopy(SourceName=branched_dll.r,SourceCabKey=branched_dll.r,DestName=branched_dll.dll,Attributes=0,FileSize=225664,PerTick=65536,,VerifyMedia=0,,TotalPatches=1,,,CheckCRC=0,Version=1.1.1.195,Language=0,InstallMode=130023424,,,,,,,)
File: C:\inetpub\wwwroot\Service\bin\branched_dll.dll; Overwrite; Smart patch; REINSTALLMODE specifies all files to be overwritten
Redirecting file copy of 'C:\inetpub\wwwroot\Service\bin\branched_dll.dll' to 'C:\Config.Msi\PTB2C9.tmp'. A subsequent patch will update the intermediate file, and then copy over the original.
Source for file 'branched_dll.r' is uncompressed, at 'C:\Windows\Installer\$PatchCache$\Managed\CA6D1F2B4A599A44A92536A1A31D3498\1.1.1\'.
これは私の深さから少し外れています。分岐したDLLにパッチを適用しようとしていることがわかりますが、パッチを適用できず、何らかの理由でファイルを一時ディレクトリにスローします(「スマートパッチ」の正確な意味についての詳細は見つかりませんでした)。間違ったバージョンに適用されたパッチでこれが発生するのを見てきましたが、これはパッチではありません!これは、REINSTALLMODE = v(oa)musおよびREINSTALL=ALLで実行される通常のインストーラーです。古いバージョンが表示され、新しいバージョンが埋め込まれていることを確認して、古いバージョンを吹き飛ばす必要があります。
(気まぐれに、クライアントに提供したアップデーターを使用する代わりに、DLLを手動で更新しようとしました。すべてが正しく更新されたため、ファイル自体が詰まることはありません)
私の当面の目標は、このクライアントを同期に戻すことです。できれば、アンインストールせずに、専用のアップデーターを作成するのではなく、1つの統合インストーラーを使用します。それが不可能な場合、ファイルはすでに野生になっているので、私は特別な場合に腹を立てることができます。私の将来の目標は、これを私が想定したように自然に機能させることです。ファイルは古いバージョンであり、ファイルは置き換えられます。他に何も問題はありません。
私は関連するすべてを提供したと思いますが、そうでない場合は、より多くの情報を提供できます。私は今日の大部分をこれを見て過ごしましたが、このシナリオに似た資料を見つけることができません。