WiX 3.8在重大升级期间保持配置文件状态

时间:2017-10-13 22:36:21

标签: wix windows-installer installer config major-upgrade

我正在使用WiX 3.8(我认为是最新的稳定版本),在重大升级期间,我似乎无法获得而不是的配置文件被卸载并重新安装。

关于此问题有很多问题 - 很多答案都指向this网站作为一个好答案。但是,给出的建议不起作用(对我而言)。

网站所说的是将每个配置文件放在其自己的组件中,并将该文件标记为组件的关键路径。像这样:

  <Component Id="config.xml"
             Guid="*"
             Directory="folder_where_config_file_lives">
         <File Id="config_file"
               Source="$(var.Project.ProjectDir)bin\Release\configFile.xml" 
               KeyPath="yes"/>
  </Component>

大。接下来它会在 InstallFiles 操作后安排 RemoveExistingProduct ,如下所示:

<InstallExecuteSequence>
     <RemoveExistingProducts After="InstallFiles"/>
 </InstallExecuteSequence>

问题是,当我编译时,我收到此错误:

  

InstallExecuteSequence表包含一个操作   在两个不同位置声明的“RemoveExistingProducts”。   请删除其中一个操作或设置Overridable ='yes'   属于他们的一个元素。

This person也遇到了这个问题,但他似乎已经解决了这个问题。修复它的原因是为它添加了一个调度属性,它有效地摆脱了“两个不同位置”的声明问题(我猜):

        <MajorUpgrade  Schedule="afterInstallInitialize"
                       DowngradeErrorMessage="A newer version of [ProductName] is already installed."/>

因此,当我替换 计划更改属性(其中包含 属性本身,我猜)时,它不仅不起作用 - 配置文件也会被删除,在升级期间更换 - 它会导致更加奇怪。我的项目有一个包含大量MSI的引导程序,虽然我获得了安装包含配置文件的MSI之后的所有MSI的日志文件,但是它们没有安装。

让我重复一遍:日志说安装了MSI,但事实并非如此。我可能在日志文件中找不到某个地方的回滚,但是读取MSI日志文件看起来就像安装一样。

在Wix 3.8的重大升级过程中,是否有人知道配置文件的方式被删除并重新安装?我上面提到的是我能找到的互联网上最好的信息,但是我已经尝试了几乎所有的东西都无济于事。

2 个答案:

答案 0 :(得分:2)

MajorUpgrade元素包含您需要的所有内容,包括计划RemoveExistingProducts操作的位置。不要将RemoveExistingProducts添加到序列中。

RemoveExistingProducts不应该在InstallFiles之后。目前尚不清楚它来自何处,但文档并未说明这是一个选择:

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

当RemoveExistingProducts提前排序时(例如在InstallInitialize或InstallValidate之后),这意味着您正在有效地卸载旧产品,然后安装新产品升级,这意味着卸载配置文件并在升级中安装配置文件。保留配置文件的方法是安排REP afterInstallExecute。这导致升级基本上是新产品的版本规则安装,而不是旧版本的安装。版本规则意味着如果您需要更新的二进制文件,则必须更新其文件版本。关于数据文件(您的配置文件)的好消息是更新的数据文件不会被替换:

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

然后卸载旧产品,保留最终的文件集。

因此,MajorUpgrade中的REP afterInstallExecute的排序似乎就是你想要的。需要注意的是,您需要遵循组件规则,如果您在WiX中自动生成* guid,则应自动执行这些规则。

答案 1 :(得分:0)

IMO,Windows Installer是在XML发布之前发明的,组件规则不能很好地处理它。我更喜欢做的是不打击这种行为。编写应用程序,以便安装程序拥有一个配置文件,并且始终可以安全地覆盖该配置文件,并保存另一个包含MSI不知道的用户配置数据的配置文件。第二个文件应该覆盖第一个文件。