0

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

SO上有很多关于这个的问题——很多答案都指向这个网站作为一个很好的答案。但是,给出的建议不起作用(对我来说)。

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

  <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' 属性。

这个人也有这个问题,但他似乎已经解决了。为他解决的问题是在 中添加了一个调度属性,这有效地摆脱了“两个不同的位置”声明问题(我猜):

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

所以当我替换计划更改属性(其中包含一个属性本身,我猜),它不仅不起作用——配置文件在升级过程中被删除和替换——它会导致更多的怪异。我的项目有一个带有很多 MSI 的引导程序,虽然我获得了用于安装包含配置文件的 MSI 之后的所有 MSI 的日志文件,但它们并没有安装。

让我重复一遍:日志说安装了 MSI,但没有安装。我在日志文件中找不到的某个地方可能存在回滚,但是阅读 MSI 日志文件时,安装看起来很顺利。

有谁知道在 Wix 3.8 的主要升级期间删除和重新安装配置文件的方法?我上面提到的是我能从互联网上找到的最好的信息,但是我在 SO 上尝试了几乎所有的东西都无济于事。

4

2 回答 2

2

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 中的 REP afterInstallExecute 的排序似乎是您想要的。需要注意的是,您需要遵循组件规则,如果您在 WiX 中有自动生成的 * guid,这应该会自动发生。

于 2017-10-14T00:50:43.277 回答
0

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

于 2017-10-15T22:20:42.813 回答