1

現在、次の手順に従ってビルドされた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要素は無視されているようです。

http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Re-Multiple-instance-patches-td1559146.html

私はここで100%肯定的ではありませんが、検証の一部は、パッチアプリケーション自体ではなく、2つのイメージに基づくパッチの生成に関係していると思います(PCPからMSIMSPを使用してパッチを生成する古い方法で)ファイル)。パッチ変換の生成に使用される2つのイメージに同じ製品コードがなく、ProductID検証がnoに設定されている場合、エラーは発生しません。そうしないと、パッチの生成中にエラーが返され、入力が無効である可能性があることなどが通知されます。

4

2 に答える 2

1

パッチの作成には、製品コードを照合するだけでなく、複数のルールに従う必要があります。次のMSDNの記事では、これらのルールについて詳しく説明しています。http: //msdn.microsoft.com/en-us/library/aa367850.aspx

Yan Sklyarenkoによってリンクされた記事でもわかるように、同じルールが最初に彼にも問題を引き起こしました。

于 2013-02-12T09:29:43.163 に答える
1

私はこれをうまく機能させることができました。オリジナルのパッチは、さまざまな理由でPatchCreation要素を使用して作成されています。この方法で作成された変換は、ProductCodeとUpgradeCodeをチェックする検証を使用してセットアップされます。最終的に、各トランスフォームのProductCode / UpgradeCodeを変更する代わりに、トランスフォームを更新してこれをオフにしました。したがって、要約すると、パッチを新しい製品コードに適用するには、次のようにします。

  • Template SummaryInfoプロパティを更新し、元のProductCodeをインスタンスProductCodeに置き換えます
  • 変換を抽出し、ProductCodeとUpgradeCodeの検証を無効にするバージョンに置き換えます

次に、パッチは次のコマンドでインストールされます。

REM This works fine
msiexec /p <patch.msp> /n {<ProductCode>}

これは私にとってはうまくいきませんでした-Windowsインストーラーがパッチの一時的なコピーを作成できなかったことを示すエラーがログから表示されます。

REM DON'T USE THIS!
msiexec /i {<ProductCode>} PATCH=<patch.msp>

編集:無効にする適切な検証フラグは次のとおりです。

PatchProduct =      0x00020000, // Disables product code matches
PatchUpgradeCode =  0x08000000, // Disables upgrade code matches
PatchMagic =        0x00040000, // Heck knows what this does - but Orca disables this
于 2013-02-19T17:26:18.353 に答える