WiX, how to prevent files from uninstalling though we forgot to set Permanent=“yes”

前端 未结 2 1423
-上瘾入骨i
-上瘾入骨i 2021-02-15 11:42

We have a product installer created with Wix, containing a program package (\"V1\") and some configuration files. Now, we are going to make a major upgrade with

相关标签:
2条回答
  • 2021-02-15 12:09

    Try the NeverOverwrite attribute for the configuration file

    If this attribute is set to 'yes', the installer does not install or reinstall the component if a key path file or a key path registry entry for the component already exists.

    EDIT

    I have just tested this in a test setup. At first it didn't work because I had scheduled the RemoveExistingProducts action before InstallInitialize sequence. This removes the old product before the new product is installed so it can't compare.

    However when I set it to after InstallFinalize it did work, it left the file there even though the original setup didn't have NeverOverwrite set. here are my two test examples

    version 1.0.0.0

    <?xml version="1.0" encoding="utf-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
        <Product Id="35d07bf8-a729-402d-83d6-fdc55799a3d5" Language="1033" Manufacturer="..." Name="test1" UpgradeCode="9773a278-068d-4fac-8241-4a5b7e54f15a" Version="1.0.0.0">
            <Package Compressed="no" InstallerVersion="200" />
            <Property Id="ALLUSERS" Value="1" />
            <Upgrade Id="9773a278-068d-4fac-8241-4a5b7e54f15a">
                <UpgradeVersion OnlyDetect="no" Property="REMOVEOLDVERSION" Maximum="1.0.0.0" IncludeMaximum="no" />
                <UpgradeVersion OnlyDetect="yes" Property="NEWERFOUND" Minimum="1.0.0.0" IncludeMinimum="no" />
            </Upgrade>
            <Directory Id="TARGETDIR" Name="SourceDir">
                <Directory Id="ProgramFilesFolder" Name="ProgramFilesFolder">
                    <Directory Id="INSTALLDIR" Name="test1">
                        <Component Id="New_Text_Document.txt" Guid="{CCA38D83-A890-4528-B11D-DA2E2DCDED93}" Feature="ProductFeature">
                            <File Id="New_Text_Document.txt" KeyPath="yes" Source="Harvest\ProgramFilesFolder\INSTALLDIR\New Text Document.txt" />
                        </Component>
                    </Directory>
                </Directory>
            </Directory>
            <Feature Id="ProductFeature" Level="1" Title="CompletePackage" Description="The complete Product." Display="expand" />
            <CustomAction Id="NewerFound" Error="A later version of [ProductName] is already installed" />
            <InstallExecuteSequence>
                <Custom Action="NewerFound" After="FindRelatedProducts">NEWERFOUND</Custom>
                <RemoveExistingProducts After="InstallFinalize" />
            </InstallExecuteSequence>
            <UIRef Id="WixUI_Minimal" />
            <Media Id="1" />
            <UI />
        </Product>
    </Wix>
    

    version 1.0.1.0

    <?xml version="1.0" encoding="utf-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
        <Product Id="1da36626-d760-4c4c-8a5c-3eb3841dbfd5" Language="1033" Manufacturer="..." Name="test1" UpgradeCode="9773a278-068d-4fac-8241-4a5b7e54f15a" Version="1.0.1.0">
            <Package Compressed="no" InstallerVersion="200" />
            <Property Id="ALLUSERS" Value="1" />
            <Upgrade Id="9773a278-068d-4fac-8241-4a5b7e54f15a">
                <UpgradeVersion OnlyDetect="no" Property="REMOVEOLDVERSION" Maximum="1.0.1.0" IncludeMaximum="no" />
                <UpgradeVersion OnlyDetect="yes" Property="NEWERFOUND" Minimum="1.0.1.0" IncludeMinimum="no" />
            </Upgrade>
            <Directory Id="TARGETDIR" Name="SourceDir">
                <Directory Id="ProgramFilesFolder" Name="ProgramFilesFolder">
                    <Directory Id="INSTALLDIR" Name="test1">
                        <Component Id="New_Text_Document.txt" Guid="{CCA38D83-A890-4528-B11D-DA2E2DCDED93}" Feature="ProductFeature" NeverOverwrite="yes">
                            <File Id="New_Text_Document.txt" KeyPath="yes" Source="Harvest\ProgramFilesFolder\INSTALLDIR\New Text Document.txt" />
                        </Component>
                    </Directory>
                </Directory>
            </Directory>
            <Feature Id="ProductFeature" Level="1" Title="CompletePackage" Description="The complete Product." Display="expand" />
            <CustomAction Id="NewerFound" Error="A later version of [ProductName] is already installed" />
            <InstallExecuteSequence>
                <Custom Action="NewerFound" After="FindRelatedProducts">
    NEWERFOUND</Custom>
                <RemoveExistingProducts After="InstallFinalize" />
            </InstallExecuteSequence>
            <UIRef Id="WixUI_Minimal" />
            <Media Id="1" />
            <UI />
        </Product>
    </Wix>
    
    0 讨论(0)
  • 2021-02-15 12:10

    The way I am fixing this is very simple. I don't install yourapp.config files but only yourapp.config.new On the first run the application before doing anything else check for the config file. If there is none make a copy yourapp.config.new to yourapp.config

    This is very simple it doesn't use any special attributes. When the application is uninstalled the config file is not uninstalled. When the application is re-installed file is disturbed. Note that when the application is repaired the config is not modified either.

    0 讨论(0)
提交回复
热议问题