WIX,如何不替换配置文件

时间:2017-04-25 15:15:34

标签: wix windows-installer

我们有一个用wix构建的MSI,用于安装我们的基于ruby的产品。当我们发布第一个版本时,有一个错误。升级会覆盖对ruby配置文件(gemrc)的更改,在某些情况下会有效地破坏产品。

我一直试图让MSI在升级时不删除或替换配置文件,但没有成功。

我现在拥有的是:

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


  <Directory Id="embeddedDir" Name="embedded">
    <Directory Id="embeddedEtcDir" Name="etc">
      <Component Id="gemrcComponent" Guid="uuid..." NeverOverwrite='yes' Permanent='yes'>
        <File Id='gemrc' Name='gemrc'
              Source='$(var.ProjectSourceDir)\embedded\etc\gemrc.default' Vital='yes' KeyPath='yes' />
      </Component>
    </Directory>

  </Directory>

但是,从当前版本(1.0)到新版本(1.1)将使安装完全没有gemrc。继续前进它是有效的,所以从1.1到1.2它留下了现有的(修改过的)文件。

我假设,它不起作用的原因是因为它使用旧的1.0 MSI删除现有安装,并且该版本将gemrc文件标记为需要的产品的一部分被删除。

这意味着我可以解决这个问题的唯一方法是使用自定义操作(在安装之前将文件复制到临时路径,然后再将其移回。  或类似的东西)。有更好/更简单的方法吗?

1 个答案:

答案 0 :(得分:2)

您可能会看到的一些原因如下,但没有足够的信息说明哪些可能适用于您的情况:

如果您最初安排了“早期”(InstallInitialize或更早)的主要升级,则升级将完全卸载旧产品,然后安装新产品。这看起来像是对配置文件的覆盖,但严格来说并非如此。您没有说明是否确定了此问题的实际根本原因,或者主要升级的安排是否有所不同。

在InstallExecuteAgain之后安排的主要升级中,升级安装在旧产品之上,并遵循文件替换规则。因此,如果配置文件在安装后确实已更新,则不会被替换。

如果配置文件的组件ID在任何设置之间发生了变化,那么您会看到它被删除(即使在InstallExecuteAgain升级中)。文件共享由组件ID引用,因此如果升级的配置文件的组件ID与先前的安装不同,那么您会看到奇怪的行为,因为前一个文件的引用计数意味着它将被删除,但是你试图用不同的id安装另一个同名的。

您应该在启用详细MSI日志记录的情况下进行升级,以查看配置文件会发生什么。如果不清楚,那么将其张贴在其他人可以查看的地方。