WiX,如何防止文件卸载虽然我们忘了设置Permanent =“yes”

时间:2010-05-11 17:03:01

标签: windows installer wix windows-installer

我们有一个使用Wix创建的产品安装程序,其中包含程序包(“ V1 ”)和一些配置文件。现在,我们将使用新产品代码进行重大升级,其中卸载了旧版本的产品并安装了“ V2 ”。我们想要的是保存其中一个配置文件免于卸载,因为V2也需要它。遗憾的是,我们在发送V1(read this question以获取更多信息)时忘记设置Permanent="yes"选项。

问题出在以下问题:是否有一种简单的方法可以阻止文件的卸载?当然,我们可以在脚本中添加一个自定义操作来在卸载之前备份文件,然后再添加另一个自定义操作来恢复它,但是对于此任务来说似乎有点过分的恕我直言,并且可能会干扰MSI注册过程的其他部分

编辑:是的,NeverOverwrite="yes"属性已经在V2中设置,行为就像我描述的那样。

我认为在V2的组件参数中直接更改某些内容并不会有所帮助。也许有机会在卸载V1之前以某种方式在自定义操作中修改注册表,以便安装程序服务认为V1中的配置文件是使用Permanent="yes"安装的?

2 个答案:

答案 0 :(得分:6)

尝试配置文件的NeverOverwrite属性

  

如果此属性设置为“是”,则   安装程序无法安装或   如果是关键路径,请重新安装组件   文件或密钥路径注册表项   该组件已存在。

修改

我刚刚在测试设置中对此进行了测试。起初它没有用,因为我在RemoveExistingProducts序列之前安排了InstallInitialize操作。这会在安装新产品之前删除旧产品,因此无法进行比较。

但是当我将它设置为InstallFinalize之后它确实有效时,即使原始设置没有设置NeverOverwrite,它也会将文件保留在那里。这是我的两个测试例子

版本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>

版本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>

答案 1 :(得分:0)

我解决这个问题的方法非常简单。 我不安装yourapp.config文件,只安装yourapp.config.new 在第一次运行之前,应用程序在执行任何其他操作之前检查配置文件。如果没有,请将yourapp.config.new复制到yourapp.config

这很简单,它不使用任何特殊属性。 卸载应用程序时,不会卸载配置文件。 重新安装应用程序时文件受到干扰。 请注意,修复应用程序时,配置也不会被修改。