職場では、インストールパッケージの構築にWiXを使用しています。製品Xをインストールすると、そのマシンでその製品の以前のバージョンがアンインストールされるようにする必要があります。
メジャーアップグレードについてインターネット上のいくつかの場所で読んだことがありますが、それを機能させることができませんでした。以前のバージョンのアンインストール機能をWiXに追加するために必要な正確な手順を誰かが指定できますか?
職場では、インストールパッケージの構築にWiXを使用しています。製品Xをインストールすると、そのマシンでその製品の以前のバージョンがアンインストールされるようにする必要があります。
メジャーアップグレードについてインターネット上のいくつかの場所で読んだことがありますが、それを機能させることができませんでした。以前のバージョンのアンインストール機能をWiXに追加するために必要な正確な手順を誰かが指定できますか?
最後に解決策を見つけました-同じ問題を抱えている可能性のある他の人のためにここに投稿しています(5人全員):
製品の下に以下を追加します。
<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 に置き換えます
最新バージョン(3.5.1315.0ベータ版から)では、独自の要素を使用する代わりに、MajorUpgrade要素を使用できます。
たとえば、このコードを使用して自動アップグレードを実行します。これにより、ダウングレードが防止され、ローカライズされたエラーメッセージが表示されます。また、既存の同一バージョンのアップグレードも防止されます(つまり、下位バージョンのみがアップグレードされます)。
<MajorUpgrade
AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
AllowSameVersionUpgrades="no"
/>
以下は、私がメジャー アップグレードに使用する一種の構文です。
<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>
ビルドに注意すれば、人々が誤って古いバージョンの製品を新しいバージョンの上にインストールするのを防ぐことができることに注意してください。それが Maximum フィールドの目的です。インストーラーをビルドするとき、UpgradeVersion Maximum をビルド中のバージョンに設定しますが、このシナリオを防ぐために IncludeMaximum="no" に設定します。
RemoveExistingProducts のスケジュールに関して選択肢があります。私はInstallFinalizeの後にそれをスケジュールすることを好みます(他の人が推奨するようにInstallInitializeの後ではなく):
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallFinalize"></RemoveExistingProducts>
</InstallExecuteSequence>
これにより、新しいファイルとレジストリ キーがコピーされるまで、製品の以前のバージョンがインストールされたままになります。これにより、古いバージョンから新しいバージョンにデータを移行できます (たとえば、ユーザー設定のストレージをレジストリから XML ファイルに切り替えましたが、丁寧に設定を移行したい場合)。この移行は、InstallFinalize の直前に延期されたカスタム アクションで行われます。
もう 1 つの利点は効率です。変更されていないファイルがある場合、Windows インストーラーは、InstallFinalize の後にスケジュールを設定するときにそれらを再度コピーする必要がありません。InstallInitialize の後にスケジュールすると、最初に以前のバージョンが完全に削除されてから、新しいバージョンがインストールされます。これにより、不要なファイルの削除と再コピーが発生します。
その他のスケジュール オプションについては、MSDN の RemoveExistingProducts ヘルプ トピックを参照してください。今週のリンクは次のとおりです: http://msdn.microsoft.com/en-us/library/aa371197.aspx
これはWiX-users メーリング リストで尋ねたほうがよいかもしれません。
WiX は、Windows インストーラーが何をしているかをしっかりと理解している場合に最適です。「 The Definitive Guide to Windows Installer 」を入手することを検討してください。
既存の製品を削除するアクションは、RemoveExistingProducts アクションです。つまり、障害によって古い製品が再インストールされるかどうか、変更されていないファイルが再度コピーされるかどうかなど、スケジュールの場所によって結果が異なるため、自分でスケジュールを設定する必要があります。
RemoveExistingProducts
現在のインストールの要素を処理し、システムにインストールされているすべての製品の(要素で指定された) に属性を<Upgrade>
一致させます。は、関連製品のファミリを定義します。この UpgradeCode を持ち、バージョンが指定された範囲に収まり、属性が指定されている(または指定されていない) 製品はすべて削除されます。@Id
UpgradeCode
<Product>
UpgradeCode
UpgradeVersion/@OnlyDetect
no
プロパティRemoveExistingProducts
の設定に関する言及のドキュメント。これは、削除される製品UPGRADINGPRODUCTCODE
のアンインストール プロセスが、インストールされる製品の値であるそのプロパティを受け取ることを意味します。Product/@Id
元のインストールに が含まれていない場合、UpgradeCode
この機能は使用できません。
このサイトを使用して、WiX Upgrade の基本を理解することができました。
http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization
その後、サンプル インストーラーを作成し (テスト ファイルをインストール)、アップグレード インストーラーを作成しました (2 つのサンプル テスト ファイルをインストール)。これにより、メカニズムがどのように機能するかについての基本的な理解が得られます。
Apress の本「The Definitive Guide to Windows Installer」で Mike が言ったように、理解するのに役立ちますが、WiX を使用して書かれていません。
かなり役に立った別のサイトは次のサイトです。
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 " パラメーターを使用するようにドキュメントに記載されていることですが、これらのパラメーターがメジャー アップグレードに禁止されているとは記載されていません- それらは単に機能しなくなります。したがって、メジャー アップグレードでは使用しないでください。
しばらくの間チュートリアルから逃した重要なことの 1 つ ( http://www.tramontana.co.hu/wix/lesson4.phpから盗んだもの) が原因で、「この製品の別のバージョンが既にインストールされています」というエラーが発生しました。
*小規模な更新 とは、製品バージョン (major.minor.build) の変更が保証されない、1 つまたはいくつかのファイルへの小規模な変更を意味します。製品 GUID も変更する必要はありません。以前のファイルとはまったく異なる新しい .msi ファイルを作成するときは、常にパッケージ GUID を変更する必要があることに注意してください。インストーラーは、インストールされたプログラムを追跡し、ユーザーがこれらの GUID を使用してインストールを変更または削除するときにそれらを見つけます。異なるパッケージに同じ GUID を使用すると、インストーラーが混乱します。
マイナー アップグレード は、製品バージョンが既に変更されている変更を示します。Product タグの Version 属性を変更します。製品は同じままなので、製品 GUID を変更する必要はありませんが、もちろん新しいパッケージ GUID を取得してください。
メジャー アップグレード とは、あるフル バージョンから別のフル バージョンに移行するなどの重要な変更を意味します。すべてを変更します: バージョン属性、製品およびパッケージ GUID。
Alex Shevchuk のチュートリアルをご覧になることをお勧めします。彼は WiX による「メジャー アップグレード」について、MSI から WiX へのパート 8 - メジャー アップグレードで実践的な例を挙げて説明しています。
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>
Product の UpgradeCode が Upgrade の Id と一致していることを確認してください。
これは、メジャーダウングレードであっても、私にとってはうまくいきました:
<Wix ...>
<Product ...>
<Property Id="REINSTALLMODE" Value="amus" />
<MajorUpgrade AllowDowngrades="yes" />