安装新版本后,WIX Burn 升级会删除 ExePackages

标签 wix bootstrapper burn wix3.11

如何防止 Wix burn 在升级安装期间删除 ExePackage

背景:我正在使用 Wix 3.11 和自定义 Bootstrap 应用程序以及多个 ExePackageMsiPackage 创建安装程序。某些 ExePackages 安装的依赖项不太可能在我们产品的版本之间发生更改。我正在尝试在发布安装程序的第一个版本之前测试升级方案。

这是我的一个 ExePackages 的示例:

<ExePackage
    Id="InstallDependencyApp"
    DisplayName ="DependencyApp"
    SourceFile="$(var.InstallerApp.TargetPath)"
    CacheId="E1FFF6FF-0B84-41B4-982E-B8920DBA6A73"
    PerMachine="yes"
    DetectCondition="DependencyApp_InstalledVersion &gt;= DependencyApp_BundleVersion"
    InstallCommand="install dependencyApp [INSTALLCONFIG] [WixBundleLog_InstallDependencyApp]"
    UninstallCommand="uninstall dependencyApp [INSTALLCONFIG] [WixBundleLog_InstallDependencyApp]">
        <PayloadGroupRef Id="ExeDeps"/>
        <ExitCode Behavior="success" Value="0"/>
        <ExitCode Behavior="error" Value="-1"/>
</ExePackage>

据我了解,在升级过程中,Wix Bootstrap 将安装所有软件包的新版本,然后触发旧 Bootstrap 的静默卸载。

在我的例子中,升级安装程序(适本地)跳过依赖项安装程序的 ExePackages,因为 DetectCondition 表明它们已经安装。然后,先前版本的卸载程序会运行,并删除 ExePackages,即使新版本仍需要它们作为依赖项。

如果卸载发生在升级安装之前,那也没关系,因为依赖项将被卸载然后重新安装。但我认为当卸载发生在链中时我无法更改。

我认为我可以通过在 Bootstrap 的 PlanPackageBegin 监听器中放置一些自定义逻辑来解决此问题,这将有条件地跳过在升级场景中卸载具有某些 ID 的软件包。但这似乎是一个困惑的解决方案。有没有更好的方法来配置我的包以正确处理这些包?

最佳答案

要启用引用计数,请声明包的依赖项提供程序:

<ExePackage>
  <dep:Provides Key="MyKey" Version="1.0.0.0" />
</ExePackage>

这意味着当安装包时, bundle 会注册该提供程序并为自己的提供程序添加引用计数。在升级过程中,新 bundle 将添加自己对提供程序的引用。当旧的包被卸载时,它会看到仍然存在引用,并且只会删除其引用而不是卸载包。

关于安装新版本后,WIX Burn 升级会删除 ExePackages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72131101/

相关文章:

wix - 如何在不弄乱 UI 序列的情况下在 welcomeDlg 之前插入自定义对话框

.net - 如何将参数传递给 BootstrapperFile?

WiX Burn Bootstrapper 本地化

Wix - WixBundleOriginalSourceFolder 与 WixBundleSourceProcessFolder

wix - 安装证书作为 WiX 包的一部分

c# - 这个 .wixproj 文件的 $(WixTargetsPath) 属性在哪里设置?

.net - Bootstrapper 先决条件排序

wix - 我可以同时释放msi和exe吗?

powershell - 如何在正确访问 Windows 注册表的情况下在 WiX 中启动 PowerShell?

wix - 是否可以使用 wix bootstrapper 自动下载先决条件