我们一直在使用自定义引导程序应用程序使用WIX和Burn重建我们的安装程序。我们在主MSI中使用了一个功能树,并设置了EnableFeatureSelection =" yes"这样我们就可以在自定义BA UI中复制特征树,并在计划/应用时将这些特征选择发送到MSI。在我们最近开始测试升级过程之前,这一切都运行良好。我们遇到了Burn中看似开放的错误:
http://wixtoolset.org/issues/4616/
当我们进行次要升级时,已安装的功能不会升级...原始安装的代码仍保留在计算机上。通过我们已经完成的测试和调查,我们相信它是因为Burn没有通过REINSTALL =" ALL"到MSI包(这就是上面提到的bug)。
我们发现这个问题,Rob说你必须处理OnPlanMsiFeature()回调,我们正在做的。
wix pass option to msi for repair
由于上述错误自2014年12月开放以来,我们没有信心很快就会修复,因此我们决定尝试找到解决方法。到目前为止,我们提出的最多只是hackish,但在概念证明水平上,它显示了一些承诺。我们正在复制整个MsiPackage节点,为副本提供一个新ID并在其上添加一个REINSTALL = ALL的属性,如下所示:
<MsiPackage Id="MSI"
Cache="yes"
Compressed="no"
DisplayInternalUI="no"
Vital="yes"
Visible="yes"
EnableFeatureSelection="yes"
SourceFile="<path to MSI>">
</MsiPackage>
<MsiPackage Id="MSI_REINSTALL"
Cache="yes"
Compressed="no"
DisplayInternalUI="no"
Vital="yes"
Visible="yes"
EnableFeatureSelection="yes"
SourceFile="<path to MSI>">
<MsiProperty Name="REINSTALL" Value="ALL"/>
</MsiPackage>
然后,在我们的自定义BA中,我们使用DetectRelatedMsiPackage事件来检测次要升级。并使用该次要升级检测将我们的PlanPackageBegin事件处理程序中的每个MsiPackage的RequestState设置为Local或None,如下所示:
if (e.PackageId == "MSI")
{
if (Operation == RelatedOperation.MinorUpdate)
{
e.State = RequestState.None;
}
else
{
e.State = RequestState.Present;
}
}
if (e.PackageId == "MSI_REINSTALL")
{
if (Operation == RelatedOperation.MinorUpdate)
{
e.State = RequestState.Present;
}
else
{
e.State = RequestState.None;
}
}
我们希望得到其他人的一些指导,这些人在Burn启用EnableFeatureSelection时进行升级时会遇到此错误。我们的解决方法能完成这项工作吗?或者,有没有办法从自定义BA动态创建MsiProperty,以便我们可以根据需要创建REINSTALL = ALL?有没有人有其他想法如何解决这个更清洁和/或更可靠的问题?
如果您需要更多信息,请与我们联系。我们已经和Wix / Burn合作了几个月,所以我们知道一些事情......但我们还不是专家。
答案 0 :(得分:0)
如果您设置EnableFeatureSelection="no"
次要升级按预期工作。如果您有EnableFeatureSelection="no"
,也许可以为https://stackoverflow.com/a/9679734/5698530中要更新的功能添加“ADDLOCAL”作为MSIProperty。这篇文章也帮助了我https://stackoverflow.com/a/15394954/5698530。
答案 1 :(得分:0)
我们已经运行了原始问题中描述的“双MSI”解决方案几个月了,它的工作可靠。如果开放的错误得到修复,那么我们可以改变我们的方法。此外,如果有人有更好的答案,请告诉我。在那之前,我会将此标记为已回答。