これは一般的なニーズであるに違いありませんが、ウェブ上でそれへの参照はほとんど見つかりません...
サーバーに 1 つ、Web ヘッドに 1 つ、開発者のマシンに 1 つ、合計 3 つのコンポーネント セットを持つ製品があります。3 つのセットはすべて 1 台のマシンにインストールでき、問題なく共存できます。
昨日のように、各コンポーネントは別の場所にインストールされ、正常に動作していましたが、一部のファイル、gac 化されたアセンブリ、およびレジストリ設定を共有する必要があるため、これは一時的なものでした。今、共有コンポーネントからマージ モジュールを作成しました。この新しいマージ モジュール シナリオは、理想的な条件下でのインストール中に正常に機能し、単一の msi のメジャー アップグレードをすべて把握しました。
問題は、msi のインストール中に、インストール中の msi 内のマージ モジュールのバージョンが、既にインストールされている (別の msi の) バージョンよりも低い場合です。新しいバージョンが古いバージョンで上書きされます。さらに、3 つの msis のいずれかのアンインストール ルーチンの際に、他のインストールされたコンポーネントによってまだ使用されているにもかかわらず、共有されたものが削除されます。
ほとんどの場合、この動作が発生する理由は理解できますが、共有コンポーネント用に別のインストーラーを用意せずにこれらのコンポーネントを共有できるようにインストーラーを構成する方法がわかりません。また、1 つの大きなインストーラーも必要ありません。これではうまくスケーリングできません。
私が望むのは、3 つのインストーラーに、ビルド時に利用可能なマージ モジュール内のコンポーネントの最新バージョンが含まれていることです。インストール時に、共有コンポーネントの新しいバージョンがインストールされている場合は、それらを上書きしないでください。アンインストール (およびアップグレード) 時に、追跡する必要がある参照カウントによって、共有アイテムを削除する必要があるかどうかが決まります。
何か足りない場合のために、マージ ファイルの重要な部分を以下に示します。マージ モジュールのバージョン番号 ("wxy" の y) はビルドごとに増分され、パッケージ ID は固定されたままで、各コンポーネントはShared="yes"
(ただし、私もこれなしで試しました)。
さまざまなバージョン番号をレジストリに保存し始めましたが、レジストリのバージョン番号が存在しないかそれ以下の場合にのみ、マージ モジュール機能を条件付きでインストールできるのではないかと考えました。しかし、ドキュメンテーションにあるように、条件付き引数は wxyz を適切に評価できません。ドキュメントでは AppSearch が提案されていますが、AppSearch RegistrySearch は存在を確認することしかできず、バージョン番号の比較もできません。どうやら FileSearch は可能ですが、アセンブリ ファイルのバージョン番号はビルドごとにインクリメントされません。
また、MergeModules には多くの問題があることを読みましたが、おそらくこれらの問題が原因である可能性がありますが、wixlibs もこれらの問題に対する解決策を提供していないようです。
では、マージモジュールのバージョン管理を行う正しい方法は何ですか??? Amazon で「merge module versioning」という TOC エントリがある本を見つけましたが、その本は絶版になっています。:-P