0

マージ モジュールを使用するインストーラーがあります。マージ モジュールの最新バージョンには、一部のファイルのダウングレードが含まれています。インストーラーを使用して以前のバージョンからアップグレードする場合、これらのファイルをダウングレードする際に問題が発生します。

最初は、マージ モジュールのファイルが削除され、再インストールされませんでしたが、wix メジャー アップグレードを読んだ後、要素に設定Schedule='afterInstallFinalize'したすべてのファイルがインストールされませんでした。MajorUpgradeこれにより、新しいバージョンのファイルが保持されました。

アップグレード中にこれらのファイルがダウングレードされるように、インストーラーまたはマージ モジュールを変更するにはどうすればよいですか?

4

1 に答える 1

1

私の意見では、この問題に取り組む最善の方法は、標準アクション「RemoveExistingProducts」を CostInitialize 標準アクションの前にシーケンスすることです。このスケジューリングは、次の Microsoft の推奨に従っていないことに注意してください。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa371197(v=vs.85).aspx

そのため、msi パッケージをビルドしようとすると、最終的に ICE エラー メッセージを抑制しなければならない場合があり、抑制しないとビルドできなくなる可能性があります。Wix で ICE エラー メッセージを非表示にする簡単な方法があります。これは、Visual Studio IDE でも、candle.exe を使用して .wxs プロジェクトをコンパイルするときにも実行できます。Wix のドキュメントには、これに関する十分な詳細が記載されています。

Microsoft が推奨する RemoveExistingProducts の配置に逆らってもよいかどうか疑問に思っている場合は、以下をご覧ください。

MajorUpgrade のダウングレード ファイル

FWIW、私は過去に MS サポートに、アップグレードを正常に機能させるために費用がかかる前に REP を用意することについて話しました。が問題になります。

これが意味することは、msi パッケージに複数の機能があり、まったく同じ機能セットをアップグレード パッケージでアップグレードしたい場合、このアプローチは機能しない可能性があるということです。ただし、msi パッケージに機能が 1 つしかない場合は、このアプローチが機能します。

また、InstallInitialize および InstallFinalize の外に RemoveExistingProducts を配置すると、RemoveExistingProducts が処理されないため、アップグレード中にエラーが発生した場合に別の結果が生じることに注意してください。

発生する可能性があるのは、RemoveExistingProducts が古いアプリケーションをアンインストールしてから、アップグレード プロセスが製品の新しいバージョンのインストールを開始することです。ただし、この時点で、製品の新しいバージョンのインストール中にエラーが発生した場合は、アップグレードがロールバックされ、システムに製品のバージョンが存在しなくなります。

http://blogs.msdn.com/b/heaths/archive/2010/04/09/major-upgrades-with-shared-components.aspx

- もう 1 つのオプションは、REINSTALLMODE プロパティを使用することです。emus REINSTALLMODE = emus の値を使用して、プロパティ テーブルにこのプロパティを作成します。

emus が機能しない場合は、amus で試してください。 amus の使用にはリスクが伴うため、例外的な状況を除き、ほとんどの場合避けるべきです。

https://msdn.microsoft.com/en-us/library/aa371182(v=vs.85).aspx

ただし、ここでも注意が必要です。

REINSTALLMODE は呼び出し元のプロパティであり、通常はインストールを実行する人によって設定されるため、プロパティ テーブルでこれを作成することはお勧めできません。

しかし、あなたのような例外的な状況では、このアプローチを取る必要があるかもしれません.

-私が考えていた他のオプションは、Merge モジュール内のコンポーネントのコンポーネント GUID を変更することでした。ただし、これは次の条件が満たされている場合にのみ機能します。

- マージ モジュールのすべてのコンシューマーは、アップグレード サイクルの非常に早い段階で RemoveExistingProducts をシーケンス処理しています。つまり、古い製品をアンインストールして新しい製品をインストールするというアップグレードの方法に従います。したがって、これにより、すべてのコンシューマーで RemoveExistingProducts の再シーケンスが発生する可能性があります。

その理由として、現在のバージョンのマージ モジュールでコンポーネントの GUID を変更し、このマージ モジュールを使用してインストーラの最新バージョンを再構築すると仮定します。アップグレード サイクルの後半、つまり InstallFinalize の後に RemoveExistingProducts を実行する場合、Windows インストーラ コンポーネントの規則に違反しています。同じファイルを同じ場所にインストールする 2 つの製品がありますが、コンポーネントの GUId は異なります。したがって、このアプローチに従う場合は、RemoveExistingProducts をアップグレード サイクルの非常に早い段階でシーケンスすることが絶対に重要です。

お役に立てれば。

于 2015-08-14T06:10:15.480 に答える