27

開発者が変更をチェックインするたびに、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. 

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

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

おそらく、Windows インストーラーは、このタイプの「インストール済みバージョンを常に上書きする」インストールを許可していないのでしょうか?

4

4 に答える 4

28

そのため、バージョン番号を変更せずにそれを行う方法を見つけました。

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

また、RemoveExistingProducts を Before='InstallInitialize' に変更する必要がありました。そうしないと、インストール パス内のビルド間の「デルタ」のみが残ります。

以下で Wim が指摘したように、生成された製品 GUID を'*'.

于 2012-07-31T07:16:12.277 に答える
26

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

<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>
于 2014-12-24T12:42:03.007 に答える
6

試す

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

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

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

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

于 2012-07-31T03:42:18.183 に答える
4

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

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

于 2012-07-31T04:22:03.057 に答える