WiX:管理在升级期间不会覆盖配置文件,但会删除快捷方式

时间:2013-08-08 07:17:18

标签: wix installer windows-installer wix3.7

bring Wix to not overwrite a configuration file during upgrade我遇到类似forki23的类似问题。我有一个配置文件,在升级过程中不应该被覆盖,但是在卸载期间应该删除它。然而,我发现的每一个解决方案都打破了别的东西。

如果我设置NoOverwrite=yes and move the RemoveExistingProducts to InstallFinalize,则按我的意愿处理配置文件。但是,在这种情况下,由于某种原因,在升级期间会删除快捷方式。如果我在InstallInitialize中保留RemoveExistingProducts,则在升级期间实际上会删除配置文件,但是存在快捷方式。

为什么会发生这种情况并且有办法解决它?

<InstallExecuteSequence>
   <RemoveExistingProducts After="InstallInitialize" />
   <!-- InstallInitialize causes config-file to disappear during upgrade -->
   <!-- InstallFinalize causes shortcuts to disappear during upgrade -->

...

<Property Id="DISABLEADVTSHORTCUTS" Value="1" />

...

<Directory Id="INSTALLLOCATION" Name="MyApp">
  <Component Id="MYAPP.EXE" DiskId="1" Guid="...">
    <File Id="MYAPP.EXE" Name="MyApp.exe" Source="..." Vital="yes" KeyPath="yes">
      <Shortcut Id="startmenuShortcut" 
                Directory="ProgramMenuDir" 
                Name="!(loc.ProductName)" 
                WorkingDirectory='INSTALLLOCATION' 
                Icon="Icon.ico" 
                IconIndex="0" 
                Advertise="yes"  />
    </File>
    <RegistryValue Root="HKLM" 
                    Name="InstallLocation" 
                    Key="$(var.InstallLocationRegistryKey)" 
                    Type="string" 
                    Value="[INSTALLLOCATION]">
    </RegistryValue>
  </Component>
  <Component Id="MYAPP.EXE.CONFIG" DiskId="1" Guid="..." NeverOverwrite="yes">
    <File Id="MYAPP.EXE.CONFIG" 
          Name="MyApp.exe.config" 
          Source="..." 
          KeyPath="yes" />
  </Component>
...
</Directory>

...

<Directory Id="ProgramMenuFolder">
    <Directory Id="ProgramMenuDir" Name="!(loc.ProductPrefix)">
        <Component Id="ProgramMenuDir" Guid="...">
            <RegistryValue Root="HKCU" Key="SOFTWARE\MyApp" 
                           Type="string" Value="[INSTALLLOCATION]" KeyPath="yes" />         
            <RemoveFolder Id="ProgramMenuDir" On="uninstall"/>
        </Component>
    </Directory>
</Directory>

注意A:配置文件是机器范围的配置,应该适用于所有用户。

注意B:我使用的是WiX 3.7,目标平台是Windows 7和8。

3 个答案:

答案 0 :(得分:0)

理论上“NoOverwrite = yes并将RemoveExistingProducts移动到InstallFinalize”应该可行,但很明显我们正在从大局中丢失一些东西。了解Windows Installer删除快捷方式的原因的最佳方法是在启动升级设置时创建详细日志。您可以使用以下命令在cmd.exe中执行此操作: msiexec / i [msi path] / L * V debug.log

发布日志的下载链接和托管快捷方式的组件的GUID,以便我们查看日志是否有助于我们了解会发生什么。

答案 1 :(得分:0)

Windows安装程序在这些方面非常精确,如果在After =“InstallFinalize”情况下删除了任何内容,这意味着组件已被删除,MSI认为不需要,因为新版本中没有包含msi文件。请确保新版本中包含MYAPP.exe和快捷方式的组件的GUID未更改。 (与Orce或Insted等工具相比)。它似乎有!

MSI仅删除完整组件,而不仅删除快捷方式。真!也许你在Windows中有一个快捷方式的更新问题。有时会发生这种事情。尝试重新启动,以确保,这发生了,你的想法。也许你的测试程序有错误(或者是上面提到的GUID问题)。如果您没有自定义操作来删除快捷方式,或者您尝试将快捷方式添加为文件或此类危险内容,则没有太多其他可能性。

将快捷方式放在与.exe相同的组件中很常见,但在我看来并不是最佳的!我建议尽可能地分离资源,因此将其放在自己的组件中。如果您以后想要重命名快捷方式,这具有优势。然后,您只需更改此组件的GUID,并且不会触及重要的.exe文件。

这有一个小缺点,在重载方案中失去了与MYAPP.exe文件版本的直接连接,因此如果MYAPP.exe是几个不同设置之间的共享文件,则不建议这样做。这方面的完美解决方案是可能的,但这里不是重点。

答案 2 :(得分:-1)

解决方法:如果您仍然可以更改旧的(第一个)msi设置,只需将组件MYAPP.EXE.CONFIG标记为永久性。然后在重大升级期间不会被卸载(但根本没有卸载,有什么优点和缺点,换句话说,它主要适用于.config文件)。

如果你的设置版本1已经发货,那么你也可以用一些技巧做同样的事情。