如何防止 Wix burn 在升级安装期间删除 ExePackage
?
背景:我正在使用 Wix 3.11 和自定义 Bootstrap 应用程序以及多个 ExePackage
和 MsiPackage
创建安装程序。某些 ExePackages
安装的依赖项不太可能在我们产品的版本之间发生更改。我正在尝试在发布安装程序的第一个版本之前测试升级方案。
这是我的一个 ExePackages
的示例:
<ExePackage
Id="InstallDependencyApp"
DisplayName ="DependencyApp"
SourceFile="$(var.InstallerApp.TargetPath)"
CacheId="E1FFF6FF-0B84-41B4-982E-B8920DBA6A73"
PerMachine="yes"
DetectCondition="DependencyApp_InstalledVersion >= 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/