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

问题描述 投票:0回答:2

如何防止 Wix burn 在升级安装过程中删除

ExePackage

背景:我正在使用 Wix 3.11 和自定义引导程序应用程序以及多个

ExePackage
MsiPackage
创建安装程序。一些
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 引导程序将安装所有软件包的新版本,然后触发旧引导程序的静默卸载。

在我的情况下,升级安装程序(适当地)跳过依赖项安装程序的

ExePackages
,因为
DetectCondition
表明它们已经安装。然后,运行先前版本的卸载程序,并删除
ExePackages
,即使新版本仍然需要它们作为依赖项。

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

我认为我可以通过在引导程序的

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

wix bootstrapper burn wix3.11
2个回答
4
投票

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

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

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


0
投票

@Brian Henry 我也有同样的问题。你解决了吗

© www.soinside.com 2019 - 2024. All rights reserved.