WiX インストーラーのアップグレードを実装するにはどうすればよいですか?
-
02-07-2019 - |
質問
職場で私たちが使っているのは、 WiX インストールパッケージを構築するため。製品 X をインストールすると、そのマシン上のその製品の前のバージョンがアンインストールされるようにしたいと考えています。
インターネット上のいくつかの場所でメジャーアップグレードについて読んだことがありますが、それを機能させることができませんでした。誰かが WiX に以前のバージョンのアンインストール機能を追加するために必要な正確な手順を指定できますか?
解決
最新バージョン (3.5.1315.0 ベータ版以降) では、 MajorUpgrade 要素 自分のものを使用する代わりに。
たとえば、このコードを使用して自動アップグレードを実行します。これにより、ローカライズされたエラー メッセージが表示されてダウングレードが防止され、また、既存の同一バージョン (つまり、下位バージョンのみがアップグレードされます):
<MajorUpgrade
AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
AllowSameVersionUpgrades="no"
/>
他のヒント
ついに解決策を見つけました。同じ問題を抱えている可能性のある他の人 (5 人全員) のためにここに投稿します。
- 製品IDを*に変更します。
製品の下に以下を追加します。
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" /> <Upgrade Id="YOUR_GUID"> <UpgradeVersion Minimum="1.0.0.0" Maximum="99.0.0.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" /> </Upgrade>
InstallExecuteSequence の下に以下を追加します。
<RemoveExistingProducts Before="InstallInitialize" />
今後、製品をインストールするたびに、以前にインストールされていたバージョンが削除されます。
注記: アップグレード ID を独自の GUID に置き換えます
以下は、メジャー アップグレードに使用する構文の種類です。
<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="$(var.ProductVersion)">
<Upgrade Id="PUT-GUID-HERE">
<UpgradeVersion OnlyDetect="yes" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED" IncludeMinimum="no" />
<UpgradeVersion OnlyDetect="no" Maximum="$(var.ProductVersion)" Property="OLDERVERSIONBEINGUPGRADED" IncludeMaximum="no" />
</Upgrade>
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>
@Brian Gillespie が指摘したように、必要な最適化に応じて RemoveExistingProducts をスケジュールする場所は他にもあります。PUT-GUID-HERE は同一である必要があることに注意してください。
Product 要素内の Upgrade 要素とアクションの適切なスケジュールを組み合わせることで、目的のアンインストールが実行されます。削除するすべての製品のアップグレード コードを必ずリストしてください。
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="00000000-0000-0000-0000-000000000000">
<UpgradeVersion Minimum="1.0.0.0" Maximum="1.0.5.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>
ビルドに注意すれば、誤って古いバージョンの製品を新しいバージョンの上にインストールすることを防ぐことができます。それが最大フィールドの目的です。インストーラーをビルドするとき、UpgradeVersion Maximum をビルド中のバージョンに設定しますが、このシナリオを防ぐために IncludeMinimum="no" を設定します。
RemoveExistingProducts のスケジュールに関して選択肢があります。私は(他の人が推奨しているようにInstallInitialize後ではなく)InstallFinalize後にスケジュールすることを好みます。
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallFinalize"></RemoveExistingProducts>
</InstallExecuteSequence>
これにより、新しいファイルとレジストリ キーがコピーされるまで、製品の前のバージョンがインストールされたままになります。これにより、古いバージョンから新しいバージョンにデータを移行できます (たとえば、ユーザー設定のストレージをレジストリから XML ファイルに切り替えましたが、丁寧に設定を移行したいと考えています)。この移行は、InstallFinalize の直前に遅延カスタム アクションで実行されます。
もう 1 つの利点は効率です。変更されていないファイルがある場合、Windows インストーラーは、InstallFinalize の後にスケジュールを設定するときにそれらのファイルを再度コピーする必要はありません。InstallInitialize の後にスケジュールを設定すると、最初に以前のバージョンが完全に削除されてから、新しいバージョンがインストールされます。これにより、ファイルの不必要な削除や再コピーが発生します。
他のスケジュール オプションについては、MSDN の RemoveExistingProducts ヘルプ トピックを参照してください。今週のリンクは次のとおりです。 http://msdn.microsoft.com/en-us/library/aa371197.aspx
これについては、 WiX ユーザー メーリング リスト.
WiX は、Windows インストーラーが何をしているのかをしっかりと理解した上で使用するのが最適です。「」を入手することを検討してもよいでしょう。Windows インストーラーの決定版ガイド".
既存の製品を削除するアクションは、 既存の製品の削除アクション. 。実行の結果は、スケジュールされた場所によって異なるため、つまり、障害により古い製品が再インストールされるかどうか、変更されていないファイルが再度コピーされるかどうかなど、自分でスケジュールする必要があります。
RemoveExistingProducts
プロセス <Upgrade>
現在のインストール内の要素と一致する @Id
に帰属します UpgradeCode
(で指定されている) <Product>
要素)、システムにインストールされているすべての製品の。の UpgradeCode
関連製品のファミリーを定義します。この UpgradeCode があり、バージョンが指定された範囲内にあり、 UpgradeVersion/@OnlyDetect
属性は no
(または省略されている) は削除されます。
のドキュメント RemoveExistingProducts
の設定について言及しています UPGRADINGPRODUCTCODE
財産。アンインストールプロセスを意味します 削除される製品について そのプロパティを受け取ります。その値は Product/@Id
インストールされている製品の場合。
元のインストールに UpgradeCode
, の場合、この機能は使用できなくなります。
WiX アップグレードの基本を理解するためにこのサイトを使用しました。
http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization
その後、サンプル インストーラーを作成し (テスト ファイルをインストール)、次にアップグレード インストーラーを作成しました (2 つのサンプル テスト ファイルをインストール)。これにより、メカニズムがどのように機能するかについての基本的な理解が得られます。
また、Mike が Apress の書籍「Windows インストーラーの決定版ガイド」で述べているように、この本は理解には役立ちますが、WiX を使用して書かれたものではありません。
非常に役に立ったもう 1 つのサイトは次のとおりです。
私が読んだのは、 WiX ドキュメントやダウンロードしたサンプルはありましたが、アップグレードに関してはまだ多くの問題がありました。マイナー アップグレードでは、以前の製品のアンインストールを指定できるにもかかわらず、以前の製品のアンインストールは実行されません。調査に 1 日以上を費やしたところ、WiX 3.5 でアップグレード用の新しいタグが導入されたことがわかりました。使用方法は次のとおりです。
<MajorUpgrade Schedule="afterInstallInitialize"
DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit."
AllowDowngrades="no" />
しかし 主な理由 問題の原因は、ドキュメントに「REINSTALL=ALL REINSTALLMODE=vomus" マイナーおよび小規模アップグレードのパラメータですが、それらのパラメータが メジャーアップグレードは禁止 - 彼らは単に動作を停止します。したがって、メジャーアップグレードでは使用しないでください。
Alex Shevchuk のチュートリアルを参照することをお勧めします。WiX による「メジャー アップグレード」について、次の場所で優れた実践例を示して説明しています。 MSI から WiX へ、パート 8 - メジャー アップグレード.
しばらくチュートリアルから見逃していた重要なことが 1 つあります (から盗まれました) http://www.tramontana.co.hu/wix/lesson4.php)「この製品の別のバージョンがすでにインストールされています」というエラーが発生しました。
*小さなアップデート これは、製品バージョン (major.minor.build) の変更を保証しない、1 つまたはいくつかのファイルに対する小さな変更を意味します。製品 GUID も変更する必要はありません。以前のファイルとはいかなる点でも異なる新しい .msi ファイルを作成する場合は、常にパッケージ GUID を変更する必要があることに注意してください。インストーラは、インストールされたプログラムを追跡し、ユーザーがこれらの GUID を使用してインストールを変更または削除したいときにそれらを見つけます。異なるパッケージに同じ GUID を使用すると、インストーラーが混乱します。
マイナーアップグレード は、製品バージョンがすでに変更される予定の変更を示します。Product タグの Version 属性を変更します。製品は同じままであるため、製品 GUID を変更する必要はありませんが、もちろん新しいパッケージ GUID を取得します。
メジャーアップグレード は、ある完全バージョンから別の完全バージョンへの移行などの重要な変更を示します。すべてを変更します:バージョン属性、製品およびパッケージの GUID。
WiX の最新バージョン (3.0) を使用していますが、上記の機能を動作させることができませんでした。しかし、これはうまくいきました:
<Product Id="*" UpgradeCode="PUT-GUID-HERE" ... >
<Upgrade Id="PUT-GUID-HERE">
<UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND"
Minimum="1.0.0.0" IncludeMinimum="yes"
Maximum="99.0.0.0" IncludeMaximum="no" />
</Upgrade>
PUT-GUID-HERE は、製品の UpgradeCode プロパティで定義した GUID と同じである必要があることに注意してください。
以下は私にとってはうまくいきました。
<Product Id="*" Name="XXXInstaller" Language="1033" Version="1.0.0.0"
Manufacturer="XXXX" UpgradeCode="YOUR_GUID_HERE">
<Package InstallerVersion="xxx" Compressed="yes"/>
<Upgrade Id="YOUR_GUID_HERE">
<UpgradeVersion Property="REMOVINGTHEOLDVERSION" Minimum="1.0.0.0"
RemoveFeatures="ALL" />
</Upgrade>
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>
製品の UpgradeCode がアップグレードの ID と一致していることを確認してください。
これは、メジャーであっても、私にとってうまくいったことです 下 学年:
<Wix ...>
<Product ...>
<Property Id="REINSTALLMODE" Value="amus" />
<MajorUpgrade AllowDowngrades="yes" />