我们使用wix 3.9为我们的产品创建一个msi。我们的目标:我们希望通过msi提供配置文件(.txt文件)。当安装文件夹中已存在配置文件时,升级不应覆盖该文件。不幸的是,在升级时,Wix会删除配置文件。
产品元素:
<Product Id="*" Name="$(var.AppName) V$(var.Version) $(var.TargetBuild)" Language="1033" Version="$(var.Version)" Manufacturer="$(var.Manufacturer)" UpgradeCode="$(var.UpgradeCode)">
$(var.UpgradeCode)
是静态的,永远不会改变。
升级代码:
<MajorUpgrade DowngradeErrorMessage="A newer version of $(var.AppName) is already installed." AllowSameVersionUpgrades="yes" />
<Upgrade Id="$(var.UpgradeCode)">
<UpgradeVersion Minimum="1.0.0"
IncludeMinimum="yes"
OnlyDetect="yes"
Maximum="$(var.Version)"
IncludeMaximum="yes"
Property="PREVIOUSVERSIONSINSTALLED" />
</Upgrade>
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
以下是配置文件:
<Component Id="ConfigComponent" NeverOverwrite="yes" Guid="GUID-HERE">
<File Id="ConfigOutput" KeyPath="yes" Name="MyConfig.config" Source="MyConfig.config.bak"/>
</Component>
另外,我使用 RemoveFolderEx 来删除应用程序本身生成的文件。但是当我注释掉这个块时,问题仍然存在。但我想显示完整性的代码块:
<Component Id="RemoveAll" Guid="MYGUID">
<RemoveFile Id="RemoveAllFilesOnUninstall" Directory="APPLICATIONFOLDER" Name="*.*" On="uninstall" />
<RemoveFolder Id="RemoveAllFoldersOnUninstall" Directory="APPLICATIONFOLDER" On="uninstall" />
<RegistryValue Root="HKLM" Key="SOFTWARE\$(var.Manufacturer)\$(var.AppName)" Name="Path" Type="string" Value="[APPLICATIONFOLDER]" KeyPath="yes" />
<util:RemoveFolderEx On="uninstall" Property="APPLICATIONFOLDER" />
</Component>
Repro:首先,我们安装软件和文件&#39; MyConfig.config&#39;按预期显示在应用程序文件夹中。之后,我们在此配置文件中进行更改。接下来,我们构建第二个.msi并执行它。进行更新时,将按预期覆盖所有文件。但是我们错过了文件&#39; MyConfig.config&#39;现在在安装文件夹中。
更新
属性Permanent="yes"
也无法按预期工作。在升级时仍然删除配置文件:
<Component Id="ConfigComponent" Permanent="yes" NeverOverwrite="yes" Guid="GUID-HERE">
<File Id="ConfigOutput" KeyPath="yes" Name="MyConfig.config" Source="MyConfig.config.bak"/>
</Component>
答案 0 :(得分:2)
重大升级期间发生了什么:
快速解决方案(虽然我确信有更好的方法):
继续,使用Permanent =“yes”标记您的ConfigComponent,以便MSI永远不会删除它。您需要添加一个删除文件的自定义操作,并在“$ ConfigComponent = 2 And Not UPGRADINGPRODUCTCODE”上对其进行调整,以便仅在将组件设置为通过修改或完全卸载删除时执行,但不执行升级。
如果您的MSI已经发货到世界并且您需要修复升级方案,则需要编写一个自定义操作,在旧MSI删除之前将配置文件复制到备份位置。然后是另一个自定义操作,将配置文件复制回正确的目录。