如何将我的配置文件保存在MajorUpgrade上?

时间:2016-04-04 14:38:12

标签: wix windows-installer wix3.9

我们使用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>

1 个答案:

答案 0 :(得分:2)

重大升级期间发生了什么:

  1. CostInitialize / CostFinalize操作确定新MSI中应安装哪些组件。 ConfigComponent决定“不”安装,因为它被标记为NeverOverwrite =“是”。
  2. 在RemoveExistingProducts操作期间删除旧的MSI。先前的配置文件已删除。
  3. 安装了新的MSI。根据步骤1中的检查,未安装ConfigComponent。
  4. 快速解决方案(虽然我确信有更好的方法):

    继续,使用Permanent =“yes”标记您的ConfigComponent,以便MSI永远不会删除它。您需要添加一个删除文件的自定义操作,并在“$ ConfigComponent = 2 And Not UPGRADINGPRODUCTCODE”上对其进行调整,以便仅在将组件设置为通过修改或完全卸载删除时执行,但不执行升级。

    如果您的MSI已经发货到世界并且您需要修复升级方案,则需要编写一个自定义操作,在旧MSI删除之前将配置文件复制到备份位置。然后是另一个自定义操作,将配置文件复制回正确的目录。