1

これは一般的なニーズであるに違いありませんが、ウェブ上でそれへの参照はほとんど見つかりません...

サーバーに 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

4

1 に答える 1

1

私たちが望んでいるこの動作 (常に最適なバージョンの共有コンポーネントをインストールする) は、MSI 4.5 以降でのみサポートされているようです。ということは、これは WiX 自体の問題ではないのかもしれませんが、私は WiX についてほとんど何も知りません。

属性 msidbComponentAttributesShared (0x0800) を共有コンポーネントの Component テーブルに設定します。これについては、MSM を Orca で確認できます。

このブログ投稿で何かが言及されていると思います (ただし、ここではおそらくあまり役​​に立ちません): http://blogs.msdn.com/windows_installer_team/archive/2008/03/29/windows-installer-4-5-サービス強化-共有コンポーネント-およびパッチ-uninstall.aspx

于 2010-04-01T12:45:10.227 に答える