【问题标题】:WIX Installer : uninstall previous version and install new versionWIX 安装程序:卸载旧版本并安装新版本
【发布时间】:2014-06-03 00:40:45
【问题描述】:

我有一个要升级到的产品。 现在我更新了 App 代码,而不是升级代码,让它作为升级工作。

到目前为止,我没有在 WIX xml 中使用 MajorUpgrade 标记。

以下配置卸载任何以前的配置并将较新的文件安装到目录中,但它只安装那些已更改版本号的文件。

<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="$(var.SleakSoft_UpgradeCode)">
 <UpgradeVersion Minimum="4.12.0" Maximum="$(var.SleakSoft_AppVersion)" Property="OLDERVERSIONBEINGUPGRADED" OnlyDetect="no" IncludeMinimum="yes" IncludeMaximum="no" />
  <UpgradeVersion Minimum="$(var.SleakSoft_AppVersion)" IncludeMinimum="yes" OnlyDetect="yes" Language="!(loc.LANG)" Property="NEWPRODUCTFOUND" />
  <UpgradeVersion Minimum="4.12.0" Maximum="5.0.0" OnlyDetect="no" Language="!(loc.LANG)" IncludeMaximum="yes" Property="UPGRADEFOUND" />
</Upgrade>  
<CustomAction Id="PreventDowngrading" Error="Newer version of Sleak Talk is already installed." />
  <InstallExecuteSequence>
  <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
  <RemoveExistingProducts After="InstallInitialize"  />
</InstallExecuteSequence>

现在如何让它在删除现有产品后安装安装程序中的所有文件。

我已经尝试过 InstallExecure After="RemoveExistingProducts" 和 InstallExecuteAgain After="RemoveExistingProduct" 但没有成功。

【问题讨论】:

  • 我不确定我是否遵循:您想进行重大升级但不想使用MajorUpgrade?或者你想要其他类型的upgrade
  • @TomBlodget:我在使用 MajorUpdate 时没有问题,但由于我是 WIX 新手,所以我尝试了该 schedule="afterInstallInitialize" 的组合:这实际上卸载了当前安装的版本,但只是安装了较新的文件从安装程序。我与 MajorUpgrade 一起使用的另一个选项是在 InstallFinalize 之后”,但不会出现更多过度行为,它只是用更高版本替换了文件。在我的安装程序中,有一些文件具有相同的版本号,但由于它们包含一些错误,因此修复了文件大小发生了变化。

标签: installation wix uninstallation reinstall


【解决方案1】:

好的,我试过了,但现在对我有用的热修复是在卸载完成后强制重新安装所有东西。

<Property Id="REINSTALLMODE" Value="amus" />

在构建 WIX 项目时,覆盖会引发警告。属性 ID 是“产品”标签的子标签。

正如 Mirosoft WIX 文档所说

了解 Windows 安装程序如何应用文件版本控制规则 替换现有文件时。 Windows 安装程序首先确定 之前是否已经安装了组件的密钥文件 试图安装组件的任何文件。如果 安装程序找到与组件的密钥文件同名的文件 安装在目标位置,它会比较版本、日期和 两个关键文件的语言并使用文件版本控制规则 判断是否安装包提供的组件。如果 安装程序确定它需要更换组件基础 密钥文件,然后它使用每个安装的文件版本控制规则 文件来判断是否替换文件。

因此别无选择,只能强行改写。

【讨论】:

  • 我不会推荐这种方法。它强制覆盖安装程序包含的目标系统上的任何文件 - 如果包含合并模块,则可能包含系统文件。在早期版本的 Windows 中,这可能会降级系统文件,而在更高版本中,可能会导致运行时错误。
【解决方案2】:

正确的答案是在 InstallInitialize 之后,但如果这不起作用,那么您将遇到更大的问题。例如,如果您尝试这样做并且它只安装了具有更高版本的新文件,那么您的主要升级逻辑根据定义是不正确的,因为这将在安装新产品之前卸载旧产品。所以也许你没有检测到旧产品。这些是规则,假设您的 MSI 文件中有适当的升级检测机制:

新的 ProductCode 和 PackageCode。 相同的升级代码。 增加前三位数字的 ProductVersion。

每个用户安装不会升级每台机器,反之亦然,我认为您不能用 64 位新产品升级 32 位产品。

创建详细日志并查看 FindRelatedProducts 操作中发生的情况,查找有关检测到的产品的 cmets。

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    相关资源
    最近更新 更多