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

Fra*_*ijk 4 windows-installer wix 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>
Run Code Online (Sandbox Code Playgroud)

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

Disallowing installation of component: {A62D5200-FDE0-4DA1-A04A-7FBDACEA83B2} since the keyfile exists and the component is marked to never overwrite existing installations
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*lDW 5

NeverOverwrite 并不意味着“不卸载”,因此:

a) 如果原始安装和新安装之间的组件 ID 发生变化,则共享将无法按您的预期进行,引用计数将减少,文件将被删除,这是在升级计划“较晚”时进行的,例如安装后执行。

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

因此,请确保组件 ID 未更改,并且您的升级安排在较晚的时间,例如 afterInstallExecute。此外,使用详细日志记录进行升级以验证发生了什么。

话虽如此,NeverOverwrite 通常用于解决不存在的问题。文件覆盖规则(由“后期”升级调用)表示修改的文件不会被覆盖:

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

因此,如果第一个安装程序安装了该文件,那么它会由应用程序更新,然后您的升级运行它不会替换修改的文件,并且无需设置 NeverOverwrite。