-
Notifications
You must be signed in to change notification settings - Fork 33
Description
I just noticed that a previous upgrade of psqlODBC left some files behind in the installation directory, specifically the OpenSSL 1.1 libraries (libssl-1_1 and libcrypto-1_1). The reason is that the MSI packages violate the holy writ of Windows Installer, also known as the "component rules". The gist of those is that whenever the contents of a component (<Component>
in WiX) change, the component's GUID must also change.
See, e.g., https://learn.microsoft.com/en-us/visualstudio/extensibility/internals/windows-installer-basics and https://robmensching.com/blog/posts/2003/10/18/component-rules-101/.
Because the component codes are hardcoded and have not changed in a long time, and because the packages are authored so RemoveExistingProducts
happens after InstallFinalize
, that action never does anything. The set of components installed on the system does not change across the installation as far as Windows Installer is concerned, so RemoveExistingProducts
does nothing. Any preexisting files that are not in the new version of the package are left behind.
There are two possible fixes, listed here in order of preference:
- Do not hardcode the component codes, but leave them up to WiX. (While you're at it, do not hardcode anything else but the upgrade codes either.)
- Schedule
RemoveExistingProducts
afterInstallInitialize
. This will remove the old files before installing the new ones. See https://wixtoolset.org/docs/v3/xsd/wix/majorupgrade/ for more information on scheduling this action.