Wix丢弃标记为NeverOverWrite =“yes”的组件

时间:2017-07-07 13:11:23

标签: wix windows-installer upgrade

我已经创建了一个升级我们软件的安装程序,但出于某种原因,在升级时会删除XML配置文件(我们软件的文件)。

如果软件的所有功能都已升级,则会出现这种情况。 我们的软件是归档类型的东西。如果我只安装该功能并升级它,一切都很好。

但是,如果我安装了存档附带的所有服务并升级那些,那么所有配置文件(并且每个文件都位于不同的文件夹中!)都将消失。

举个例子:

<ComponentGroup Id="AutoArchiveTool" Directory="AutoArchiverFolder">
     <Component Id="C_AutoArchivingTool_Gateway_exe_config" NeverOverwrite="yes" Guid="{A62D5200-FDE0-4DA1-A04A-7FBDACEA83B2}">
       <File Id="F_AutoArchivingTool_Gateway_exe_config" Source="$(var.Gateway.TargetDir)Gateway.exe.config" KeyPath="yes"/>
     </Component>
... more script
</ComponentGroup>

如果您记录安装程序,您甚至可以看到它被识别为“永不覆盖”:

Disallowing installation of component: {A62D5200-FDE0-4DA1-A04A-7FBDACEA83B2} since the keyfile exists and the component is marked to never overwrite existing installations

升级后它已经消失了。我错过了什么? 我看到了“永久”属性,但这不是我想要的。我希望安装程序在升级期间单独保留配置文件。删除后不要留下它们(配置文件)。

1 个答案:

答案 0 :(得分:3)

NeverOverwrite并不代表&#34;不要卸载&#34;这样:

a)如果组件ID在原始安装和新安装之间发生变化,则共享将无法按预期工作,并且引用计数将减少并且文件将被删除,这是在安排升级时#34;迟到&#34;,例如afterInstallExecute。

b)如果提前安排升级(例如afterInstallInitialize),则首先卸载所有旧产品,然后安装新产品。你还没有说过你的升级顺序,但是有时候Windows安装程序会在早期&#34;升级:它决定文件不会被覆盖,但是当安装结果是升级时,无法重新评估该文件。在这种情况下,您的升级将完成,文件将丢失。如果您遇到此问题,则修复产品将从产品的 new 版本恢复该文件(因为这是该组件的当前所有者)。这不会有帮助。

因此,请确保组件ID没有更改,并且您的升级计划延迟,例如afterInstallExecute。此外,使用详细日志记录进行升级以验证发生了什么。

说了这么多,NeverOverwrite经常被用来解决一个不存在的问题。文件覆盖规则(由&#34;后期&#34;升级调用)表示修改后的文件不会被覆盖:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa370531(v=vs.85).aspx

因此,如果第一个安装程序安装该文件,那么它会被应用程序更新,然后升级运行它无论如何都不会替换修改后的文件,也不需要设置NeverOverwrite。