6

WiX 3.5 を使用して、インスタンス トランスフォームを備えた MSI を使用して、異なる製品名で同じマシンにソフトウェアをインストールできるようにしました。これを行うために、条件付きで定義された .wxs ファイルに製品 ID と名前の「ハードコーディングされた」リストがあります。ただし、ファイル リソースと非ファイル リソースの両方を含む単一の Feature-ComponentRef 定義しかありません。

インストールは正常に機能しているように見えますが、インスタンスをアンインストールすると、次の 2 つのソースで言及されている動作が示されます。

http://msdn.microsoft.com/en-us/library/aa367797(v=VS.85).aspx

http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Multiple-Instance-Transforms-Walkthrough-Proposed-Simple-Addition-to-WiX-to-Make-Them-Easier-td708828. html

具体的には、アプリケーションの最後のインスタンスを除いて、ファイル以外のリソース (この場合はレジストリ エントリ) がアンインストールされることはありません。(つまり、instance1、instance2、instance3 の順にアンインストールすると、instance3 のファイル以外のリソースのみが削除されます。

これは、ファイル以外のコンポーネントに一意の GUID がないことに関連していると推測しています (ファイル コンポーネントでは問題になりません)。

したがって、有効なアプローチは、1 つの製品 ID、名前、および 1 つの機能セットを含む単一の .wxs ファイルを定義することであるかどうか疑問に思っていましたが、カスタム ブートストラップに、製品および非ファイル コンポーネントの新しい GUID を生成させ、それを挿入します。実行時に MSI データベースに? つまり、その後、アンインストールまたは更新するときが来たら、インストールされたインスタンスのレジストリを照会し、それらの GUID を取得します。

これにより、事前に .wxs にハードコーディングするのではなく、実行時にインスタンスを作成し、クリーンにアンインストールすることができます。

それは理にかなっていますか?バーンはすべてを良くしますか? :)

4

2 に答える 2

4

バージョン v3.6.1511.0 の時点で、コンポーネントに「MultiInstance」属性が追加されました。これにより、Josh Rowes の WiX メーリング リストへの投稿での提案に従って、インスタンスごとにその場で GUID を生成できます (OP のリンクを参照)。私がテストしたところ、これは正しく機能し、最後のインスタンスがアンインストールされたときではなく、現在のインスタンスがアンインストールされたときにレジストリ データが削除されます。

于 2011-06-02T16:25:12.303 に答える
1

コンポーネント ID は一意である必要はありませんが、レジストリ キーは一意である必要があります。チェックアウト:

インスタンス変換を使用した複数のインスタンスの作成

記事では次のように述べています。

各インスタンスのファイル以外のデータを分離しておくために、基本パッケージはファイル以外のデータを各インスタンスのコンポーネントのセットに収集する必要があります。次に、インスタンス識別子に依存する条件ステートメントに基づいて、適切なコンポーネントをインストールする必要があります。

彼らがそこで何について話しているのか、私は実際には知りません。すべてのファイルが一意の INSTALLDIR ( InstanceID に基づいて宛先を変更するための実行時のタイプ 51 カスタム アクション) によって分離された n 層の複数インスタンス インストーラーを作成し、前述のパスの一部として InstanceID を使用してすべてのレジストリ データを変更しました。記事で。一意の構成データと一意のバージョン番号を持つ最大 16 個の一意のインスタンスをサポートしました (各インスタンスは、他のインスタンスとは別にメジャー アップグレードによってサービスを提供できます)。これはすべて、nTier アプリケーションの SaaS 展開モデルをサポートするためのものであり、独自の GUID や条件式を使用してコンポーネントを作成する必要がありました。

私がしなければならなかった唯一の厄介なことは、デスクトップにショートカットが必要なクライアント側でした。(クライアントは複数のインスタンスをサポートしました。これは、サイトが本番環境に v1.0 を持ち、テスト環境に v1.1 を持っている可能性があるためです)

フォルダー名を変更できず (修正済み)、MSI の ShortCut テーブルが formattable をサポートしていないため、InstanceID を使用してインストール テーブルで ShortCut を動的に作成するカスタム アクションを TEMP テーブルに記述し、MSI が私にとってのショートカット。

于 2011-02-18T21:49:06.790 に答える