I have a WiX installer that I've inherited that has an autogenerated product code, a fixed upgrade code, autogenerated component GUIDs and we always force major upgrades. One of the configuration files is modified by a custom action at install time and may be later modified by users. It's not marked as NeverOverwrite in existing (released) versions of the installer.
I expected the MSI file versioning rules to prevent the modified file from being replaced on upgrade, but it actually is being replaced anyway. I found this entry for the initial InstallValidate in the install log:
MSI (s) (7C:00) [12:18:07:604]: Component: conf.xml; Installed: Absent; Request: Local; Action: Local
I assume that this is the root of my problem because the component (which has the file as the keypath) is actually there even though it's showing as absent.
Later on, when the RemoveExistingProducts is scheduled the component is correctly detected by the old installer:
MSI (s) (7C:74) [12:18:09:901]: Component: conf.xml; Installed: Local; Request: Absent; Action: Absent
and then removed. Obviously I could create a custom action to backup the file and restore it during the upgrade but that seems like a hack when I don't understand why it's not being detected in the first place.
The file paths seem to be correct in both cases and as I understand it the component GUID should be generated the same for both installs too. Is there some more logging that I can enable to track this down or am I missing something obvious?