2017-04-25 47 views
0

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

我一直在试图让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文件标记为需要删除的产品的一部分。

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

+0

由于安装程序和配置文件的问题,我们在项目中决定不安装安装程序的配置文件。麻烦是不值得的。我们的应用程序查找现有的配置文件,如果它们不存在,请创建一个默认文件。 在移除过程中,我们要求保留配置文件,如果不是,请删除它们。 – linuxrocks

回答

2

你们有些人可能会看到这种情况的原因如下,但没有足够的信息,说这可能会在你的情况下适用:

如果你原来有一个重大的升级计划“早”(InstallInitialize或更早),那么升级将完全卸载旧产品,然后安装新产品。这看起来像是覆盖配置文件,但严格来说不是。如果您确定此问题的实际根本原因,或者主要升级计划安排有所不同,您不会说。

在InstallExecuteAgain后计划的主要升级中,升级将安装在旧产品之上并遵循文件替换规则。所以如果配置文件在安装后确实被更新了,它将不会被替换。

如果配置文件的组件ID在任何设置之间改变,那么您会看到它被删除(即使在InstallExecuteAgain升级中)。文件共享是通过组件ID来计算的,所以如果升级的配置文件的组件ID与之前的安装不一样,那么你会看到奇怪的行为,因为前一个文件的引用计数意味着它将被删除,但是你试图用不同的id安装另一个相同的名字。

您应该使用详细的MSI日志记录启用升级,以查看配置文件会发生什么情况。如果不清楚的话,可以将它发布到其他人可以查看的地方。

+0

组件ID确实发生了变化,因为旧版本未将该文件指定为单独的组件。 另请注意,1.1 MSI中的gemrc文件将始终具有较新的上次更新的时间戳,因为它是在MSI生成时生成的。 – user831865