web-dev-qa-db-ja.com

WIX MSIで常に以前のバージョンを削除するにはどうすればよいですか?

開発者が変更をチェックインするたびにCIビルドシステムでMSIをビルドします。インストールされたMSIで自動受け入れテストを実行します。

基本的に、すべてのMSIは製品の完全なインストールであるため、それ自体にはバージョン管理(Windowsインストーラー)はありません。

各MSIには同じ製品GUIDとアップグレードGUID、および同じバージョン番号があります。ただし、パッケージは異なりますGUID(wixでは '*'を使用します)。

私が達成したいのは、インストーラーが実行されると、以前にインストールされたバージョンの製品を「アンインストール」し、新しいバージョンをインストールするということです。すべて単一のMSIから(私たちの制御の及ばない複雑なインストールプロセスがあります) .. citrixとsccmなので、簡単なインストールパスを提供します)

私が試してみました:

<Property Id='PREVIOUSVERSIONSINSTALLED' Secure='yes' />
<Upgrade Id='$UPGRADE_GUID'>  
  <UpgradeVersion Minimum='1.0.0.0'
                  Maximum='99.0.0.0'
                  Property='PREVIOUSVERSIONSINSTALLED'
                  IncludeMinimum='yes'
                  IncludeMaximum='no' />
</Upgrade>

そして持っている:

<InstallExecuteSequence>
  <RemoveExistingProducts After='InstallFinalize' />
</InstallExecuteSequence>

そして試しました:

<InstallExecuteSequence>
  <RemoveExistingProducts After='InstallInitialize' />
</InstallExecuteSequence>

しかし、後続のビルドからmsiをインストールしようとすると、次のようになります。

Another version of this product is already installed. Installation of this version cannot continue. 
To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel. 

それは私が本当に目指していたものではありません。

商品タグのバージョン属性のみを更新できることを理解していますが、管理が難しくなります。まず、MSIを生成するビルドパイプラインが多数あり、バージョン番号を適切に処理する方法がわからないため、1日あたり20以上のmsiビルドを生成できます。

たぶん、Windowsインストーラーは、このタイプの「常にインストールされたバージョンを上書きする」インストールを許可しませんか?

20
grillp

だから私はバージョン番号を変更せずにそれを行う方法を見つけました。

製品GUIDをビルドごとに変更しますが、アップグレードGUIDは同じにします。

また、RemoveExistingProductsをBefore = 'InstallInitialize'に変更する必要がありました。それ以外の場合は、インストールパスのビルド間の「デルタ」のみを残しました。

以下のWimで説明されているように、生成されたProduct GUIDを'*'

20
grillp

このコードを使用して、古いバージョンを削除し、新しいバージョンをインストールできます。

<Product Id="*"
         UpgradeCode="87795f3dc95-81f5-473e-955e-2871a5bd66a5"
         Name="AppName"
         Language="1033"
         Version="1.0.6"
         Manufacturer="Manufacturer Name">
  <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
  <MajorUpgrade Schedule="afterInstallInitialize"
                DowngradeErrorMessage="A later version of [ProductName] is already installed"
                AllowSameVersionUpgrades="yes" />
</Product>
12
aa aa

試す

<InstallExecuteSequence>
  <RemoveExistingProducts After='InstallFinalize' />
</InstallExecuteSequence>

これにより、インストールの完了後に既存の製品が削除されますが、実行する時点をカスタマイズすることもできます。

を参照してくださいhttp://mohundro.com/blog/2009/02/23/getting-started-with-wix-and-major-upgrades/

この質問 の受け入れられた回答も参照してください

4
Daniel Powell

製品コードとバージョンが同じでもパッケージコードが異なる場合は、常にWindowsインストーラのエラーメッセージが表示されます。

CIビルドにインストーラーのバージョン情報を含めることを強くお勧めします。各ビルドをインストールし、その後アップグレードする場合、バージョン管理は悪いことではありません。これをCIビルドに追加するのは比較的簡単なはずです。

4
BryanJ