WIX Burn 升级在安装新版本后删除了 ExePackages
WIX Burn upgrade removes ExePackages after installing new version
如何防止 Wix burn 在升级安装过程中删除 ExePackage
s?
背景:我正在使用 Wix 3.11 和自定义引导程序应用程序以及多个 ExePackage
s 和 MsiPackage
s 创建安装程序。一些 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 引导程序将安装所有包的新版本,然后触发旧引导程序的静默卸载。
我的情况是,升级安装程序(适当地)跳过了依赖安装程序的 ExePackages
,因为 DetectCondition
表示它们已经安装。然后旧版本的卸载程序运行,并删除 ExePackages
,即使它们仍然需要作为新版本的依赖项。
如果卸载发生在升级安装之前,那也没关系,因为依赖项会被卸载然后重新安装。但是我不认为我可以在链中发生卸载时更改。
我想我可以通过在我的引导程序的 PlanPackageBegin
侦听器中放置一些自定义逻辑来解决这个问题,这将有条件地跳过在升级场景中卸载具有某些 ID 的包。不过,这似乎是一个混乱的修复。有没有更好的方法来配置我的包以正确处理这些包?
要启用 ref-counting,请为包声明依赖提供程序:
<ExePackage>
<dep:Provides Key="MyKey" Version="1.0.0.0" />
</ExePackage>
这意味着当包被安装时,bundle 会注册该提供者并为其自身添加一个引用计数到提供者。在升级期间,新包将添加自己对提供者的引用。当旧的包被卸载时,它会看到仍然有引用并且只会删除它的引用而不是卸载包。
如何防止 Wix burn 在升级安装过程中删除 ExePackage
s?
背景:我正在使用 Wix 3.11 和自定义引导程序应用程序以及多个 ExePackage
s 和 MsiPackage
s 创建安装程序。一些 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 引导程序将安装所有包的新版本,然后触发旧引导程序的静默卸载。
我的情况是,升级安装程序(适当地)跳过了依赖安装程序的 ExePackages
,因为 DetectCondition
表示它们已经安装。然后旧版本的卸载程序运行,并删除 ExePackages
,即使它们仍然需要作为新版本的依赖项。
如果卸载发生在升级安装之前,那也没关系,因为依赖项会被卸载然后重新安装。但是我不认为我可以在链中发生卸载时更改。
我想我可以通过在我的引导程序的 PlanPackageBegin
侦听器中放置一些自定义逻辑来解决这个问题,这将有条件地跳过在升级场景中卸载具有某些 ID 的包。不过,这似乎是一个混乱的修复。有没有更好的方法来配置我的包以正确处理这些包?
要启用 ref-counting,请为包声明依赖提供程序:
<ExePackage>
<dep:Provides Key="MyKey" Version="1.0.0.0" />
</ExePackage>
这意味着当包被安装时,bundle 会注册该提供者并为其自身添加一个引用计数到提供者。在升级期间,新包将添加自己对提供者的引用。当旧的包被卸载时,它会看到仍然有引用并且只会删除它的引用而不是卸载包。