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。
答案 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已经发货,那么你也可以用一些技巧做同样的事情。