現在、次の手順に従ってビルドされたMSTを使用して、マルチインスタンスシナリオでMSI(WiXでビルド)をMSP(これもWiXでビルド)でパッチを適用しようとすると問題が発生します。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa367797(v=vs.85).aspx
私が作成した変換ツール:
- 新しいUpgradeCode/ProductCodeプロパティを生成します
- 新しいUpgradeCodeを使用するようにUpgradeテーブルを更新します
- ProductNameプロパティを更新して、インスタンス名を含めます
- インスタンス名を含む新しいアイテムでServiceControlテーブルとShortcutテーブルを更新します
- Directoryテーブルを更新して、INSTALLDIR行のインスタンス名を含むDefaultDir列を更新します
- 変換の要約情報を生成し、変換を書き込みます
変換を適用したMSIのインストールは機能しているようです。私はそのようにmsiexecを呼び出します:
msiexec /i <product.msi> TRANSFORMS=<instance.mst> MSINEWINSTANCE=1
ただし、パッチは機能していないようです。ここで説明するようにパッチを適用しようとしました:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa369528(v=vs.85).aspx
msiexec /p <mypatch.msp> /n {product-code}
インストーラはすぐに終了し、「アップグレードするプログラムが見つからないか、アップグレードパッチが別のバージョンのプログラムを更新する可能性があるため、Windowsインストーラサービスでアップグレードパッチをインストールできません。」というダイアログが表示されます。
ベースMSIがインストールされ、WiXのPatchCreation要素でAllowProductCodeMismatches="yes"を使用してパッチがビルドされています。
パッチをインストールするにはどうすればよいですか?
編集:さらに読んだ後、私はいくつかの良くないことをしているように見えます。UpgradeCodeプロパティは必要ないと思われるため、変更をやめました。また、自分のツールからのインスタンス変換ははるかに軽量です。
@YanSklyarenkoのパッチ適用に関するブログエントリも確認しました。彼は既存のパッチを変更して、パッチが適用されるProductCodeを変更しました。私は同様のコードで同じことを試みました:
// Copy original patch
File.Copy(_patchPath, _newPatchPath, true);
// Update patch target product code
using (var patch = new PatchPackage(_patchPath))
using (var patchForWrite = new Database(_newPatchPath, DatabaseOpenMode.Transact))
{
var originalProductCode = patch.GetTargetProductCodes().First();
var productCode = _newProductCode;
foreach (var transform in patch.GetTransforms())
{
// Extract/update transforms
var tempFileName = Path.GetTempFileName();
var transformFileName = transform + _instanceName;
patch.ExtractTransform(transform, tempFileName);
using (var summaryInfo = new SummaryInfo(tempFileName, true))
{
summaryInfo.RevisionNumber = summaryInfo.RevisionNumber.Replace(originalProductCode, productCodeString);
summaryInfo.Persist();
}
// Write transform to new patch
using (var insertView = patchForWrite.OpenView("INSERT INTO `_Storages` (`Name`,`Data`) VALUES ('{0}', ?)", transformFileName))
{
using (var record = new Record(1))
{
record.SetStream(1, new FileStream(tempFileName, FileMode.Open));
insertView.Execute(record);
patchForWrite.Commit();
}
}
// Add transform to patch properties
patchForWrite.SummaryInfo.LastSavedBy += ";:" + transformFileName;
}
// Update patch properties
patchForWrite.SummaryInfo.Template = patchForWrite.SummaryInfo.Template.Replace(originalProductCode, productCodeString);
patchForWrite.SummaryInfo.Persist();
}
私はまだパッチをインストールする運がなく、msiexecはログを書き込む前に終了します。
編集2:私はまだ運がありません。WiXインスタンストランスフォームを使用してインストールしようとしましたが、パッチは適用されません。PatchCreation要素には、定義された各インスタンスのTargetProductCode要素があり、AllowProductCodeMismatchesは引き続きオンになっています。
編集3:AllowProductCodeMismatchesは、検証ではなくパッチを作成するために2つの異なる製品コード間をジャンプできるMSIMSPのもののように聞こえます。対象の製品コードをパッチに含める必要があります。残念ながら、私にとってはTargetProductCode要素は無視されているようです。
私はここで100%肯定的ではありませんが、検証の一部は、パッチアプリケーション自体ではなく、2つのイメージに基づくパッチの生成に関係していると思います(PCPからMSIMSPを使用してパッチを生成する古い方法で)ファイル)。パッチ変換の生成に使用される2つのイメージに同じ製品コードがなく、ProductID検証がnoに設定されている場合、エラーは発生しません。そうしないと、パッチの生成中にエラーが返され、入力が無効である可能性があることなどが通知されます。