Thursday, 16 October 2008

Major upgrades with WiX

I thought I was going crazy.. I’d built an installer using WiX and set the product version to 1.0.0.1. The plan was that installing a new version would automatically uninstall any old versions.

I then updated the version to 1.0.0.2 and installed the new version, only to end up with two installations.

Turns out that Windows Installer only looks at the first 3 digits of the ProductVersion (as the first Note mentions in the Windows Installer documentation on Major Upgrades) – so twiddling that 4th digit is not going to have any effect.

Here’s a sample .wxs file that works for me:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <?define version = "1.1.3.11" ?>
  
  <Product Id="*" Name="WixUpgrading $(var.version)" Language="1033" Version="$(var.version)" Manufacturer="WixUpgrading" 
           UpgradeCode="630aaa2d-a583-46db-85c4-eaf237590c61">
		<Package InstallerVersion="200" Compressed="yes" />
		<Media Id="1" Cabinet="WixUpgrading.cab" EmbedCab="yes" />
		<Directory Id="TARGETDIR" Name="SourceDir">
			<Directory Id="ProgramFilesFolder">
				<Directory Id="INSTALLLOCATION" Name="WixUpgrading">
					 <Component Id="ProductComponent" Guid="c768bc29-e2d6-4f1c-b711-2dcf91641fab">
             <File Id="TextFile1.txt" Name="TextFile1.txt" KeyPath="yes" Source="TextFile1.txt" />
           </Component> 
				</Directory>
			</Directory>
		</Directory>
		<Feature Id="ProductFeature" Title="WixUpgrading" Level="1">
			<ComponentRef Id="ProductComponent" />
		</Feature>
    <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
    <Property Id="ALLUSERS" Value="1" />
    <Upgrade Id="630aaa2d-a583-46db-85c4-eaf237590c61">
      <UpgradeVersion Property='PREVIOUSVERSIONSINSTALLED' OnlyDetect="no" IncludeMinimum='yes' Minimum='0.0.0' IncludeMaximum='no' Maximum='$(var.version)' />
      <UpgradeVersion Minimum="$(var.version)" IncludeMinimum="no" OnlyDetect="yes" Language="1033" Property="NEWERPRODUCTFOUND" />
    </Upgrade>
    <InstallExecuteSequence>
      <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWERPRODUCTFOUND AND NOT Installed</Custom>
      <RemoveExistingProducts Before='InstallInitialize' />
    </InstallExecuteSequence>
    <CustomAction Id="PreventDowngrading" Error="Newer version already installed." />
    <CustomAction Id="UIandAdvertised" Error="Something about the UI."/>
    <InstallUISequence>
      <Custom Action="UIandAdvertised" Sequence="3">ProductState=1</Custom>
    </InstallUISequence>
  </Product>
</Wix>

No comments: