Wix - 如何在启用“启用功能选择”的情况下处理次要升级?

时间:2015-09-22 20:05:45

标签: wix windows-installer install burn wix3.9

我们一直在使用自定义引导程序应用程序使用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合作了几个月,所以我们知道一些事情......但我们还不是专家。

2 个答案:

答案 0 :(得分:0)

如果您设置EnableFeatureSelection="no"次要升级按预期工作。如果您有EnableFeatureSelection="no",也许可以为https://stackoverflow.com/a/9679734/5698530中要更新的功能添加“ADDLOCAL”作为MSIProperty。这篇文章也帮助了我https://stackoverflow.com/a/15394954/5698530

答案 1 :(得分:0)

我们已经运行了原始问题中描述的“双MSI”解决方案几个月了,它的工作可靠。如果开放的错误得到修复,那么我们可以改变我们的方法。此外,如果有人有更好的答案,请告诉我。在那之前,我会将此标记为已回答。