我使用的是WiX 3.8(我认为是最新的稳定版本),我似乎无法获得的配置文件,而不是在重大升级期间卸载和重新安装。
SO上有很多关于这个的问题——很多答案都指向这个网站是一个很好的答案。然而,给出的建议(对我)不起作用。
网站所说的是将每个配置文件放在自己的组件中,并将该文件标记为组件的关键路径。类似这样的东西:
<Component Id="config.xml"
Guid="*"
Directory="folder_where_config_file_lives">
<File Id="config_file"
Source="$(var.Project.ProjectDir)binReleaseconfigFile.xml"
KeyPath="yes"/>
</Component>
太好了。接下来,它说在InstallFiles操作之后安排RemoveExistingProduct,如下所示:
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallFiles"/>
</InstallExecuteSequence>
问题是,当我编译时,我得到了这个错误:
InstallExecuteSequence表包含一个操作在两个不同位置声明的"RemoveExistingProducts"。请删除其中一个操作或设置Overridable='yes'属性。
这个人也有这个问题,但他似乎已经解决了。为他解决这个问题的是为添加了一个调度属性,这有效地解决了"两个不同位置"的声明问题(我想):
<MajorUpgrade Schedule="afterInstallInitialize"
DowngradeErrorMessage="A newer version of [ProductName] is already installed."/>
因此,当我替换计划更改属性(我想它本身包含一个属性)时,它不仅不起作用——配置文件在升级过程中被删除和替换——还会导致更奇怪的情况。我的项目有一个带有大量MSIs的引导程序,尽管我得到了安装所有MSIs的日志文件,这些MSIs位于包含配置文件的MSI之后,但它们并没有安装。
让我重复一遍:日志显示MSIs已经安装,但它们并没有安装。我可能在日志文件中找不到回滚,但读取MSI日志文件后,安装似乎进展顺利。
有人知道在Wix 3.8的重大升级过程中如何删除和重新安装配置文件以使其而不是吗?我上面提到的是我能从网络间找到的最好的信息,但我在SO上尝试了几乎所有的东西,但都无济于事。
MajorUpgrade元素提供了所需的一切,包括RemoveExistingProducts操作的计划位置。也不要将RemoveExistingProducts添加到序列中。
RemoveExistingProducts不应在InstallFiles之后。目前还不清楚这是从哪里来的,但文件并没有说这是一个选择:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa371197(v=vs.85).aspx
如果RemoveExistingProducts提前排序(例如在InstallInitialize或InstallValidate之后),则意味着您正在有效地卸载旧产品,然后安装新产品升级,这意味着卸载配置文件并安装升级中的配置文件。保留配置文件的方法是在InstallExecute之后安排REP。这导致升级,基本上是新产品在旧产品上的版本规则安装。版本规则意味着,如果你想要更新二进制文件,你必须更新它们的文件版本。关于数据文件(您的配置文件)的好消息是,更新的数据文件不会被替换:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa370531(v=vs.85).aspx
然后卸载旧产品,保留生成的一组文件。
因此,在MajorUpgrade中的InstallExecute之后对REP进行排序似乎是您想要的。需要注意的是,您需要遵守组件规则,如果您在WiX中自动生成了*guid,则应该自动执行这些规则。
IMO,Windows安装程序是在XML流行之前发明的,组件规则不能很好地处理它。我更愿意做的是不反对这种行为。编写您的应用程序,使一个配置文件由安装程序所有,并且可以始终安全地覆盖,另一个配置档案保存您的用户配置数据,而MSI对此一无所知。第二个文件应该覆盖第一个文件。