我正在使用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的重大升级过程中,是否有人知道配置文件的方式不被删除并重新安装?我上面提到的是我能找到的互联网上最好的信息,但是我已经尝试了几乎所有的东西都无济于事。
答案 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不知道的用户配置数据的配置文件。第二个文件应该覆盖第一个文件。