Wix - 如何在启用功能选择打开的情况下处理小升级?
Wix - How to handle minor upgrades with Enable Feature Selection turned on?
我们一直致力于使用自定义引导程序应用程序使用 WIX 和 Burn 重建我们的安装程序。我们在主 MSI 中使用特征树,并设置了 EnableFeatureSelection="yes" 以便我们可以在自定义 BA UI 中复制特征树并将这些特征选择发送到 MSI plan/apply 时间。在我们最近开始测试升级过程之前,这一切都运行良好。我们 运行 发现了 Burn 中的一个未解决的错误:
http://wixtoolset.org/issues/4616/
当我们进行小升级时,已安装的功能不会升级...最初安装的代码仍保留在机器上。从我们所做的测试和调查来看,我们认为这是因为 Burn 没有将 REINSTALL="ALL" 传递给 MSI 包(这就是上面的错误所说的)。
我们在 Rob 说你必须处理 OnPlanMsiFeature() 回调的地方发现了这个问题,我们正在正确地处理它。
wix pass option to msi for repair
由于上述错误自 2014 年 12 月以来一直存在,我们没有信心很快修复它,因此我们决定尝试寻找解决方法。到目前为止,我们的想法充其量只是骇人听闻,但在概念验证层面上,它显示了一些希望。我们正在复制整个 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 事件来检测次要升级。并使用该次要升级检测将每个 MsiPackage 的 RequestState 设置为 Local 或我们的 PlanPackageBegin 事件处理程序中的 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;
}
}
我们希望从其他 运行 遇到此错误的人那里得到一些指导,并在启用 EnableFeatureSelection 的情况下升级 Burn。我们的变通办法能解决问题吗?或者,有没有办法从自定义 BA 动态创建 MsiProperty,以便我们可以根据需要创建 REINSTALL=ALL?关于如何解决此问题,是否有人有其他更清洁 and/or 更可靠的想法?
如果您需要更多信息,请告诉我。我们已经与 Wix/Burn 合作几个月了,所以我们知道一些事情……但我们还不是专家。
如果您设置 EnableFeatureSelection="no"
,次要升级将按预期进行。也许可以将 "ADDLOCAL" 作为 MSIProperty 添加到您想要更新的功能,如 if you have EnableFeatureSelection="no"
. Also this post helped me 中。
几个月来,我们一直运行我最初问题中描述的"dual MSI"解决方案,而且它工作可靠。如果打开的错误得到修复,那么我们可以改变我们的方法。另外,如果有人有更好的答案,请告诉我。在那之前,我会将其标记为已回答。
我们一直致力于使用自定义引导程序应用程序使用 WIX 和 Burn 重建我们的安装程序。我们在主 MSI 中使用特征树,并设置了 EnableFeatureSelection="yes" 以便我们可以在自定义 BA UI 中复制特征树并将这些特征选择发送到 MSI plan/apply 时间。在我们最近开始测试升级过程之前,这一切都运行良好。我们 运行 发现了 Burn 中的一个未解决的错误:
http://wixtoolset.org/issues/4616/
当我们进行小升级时,已安装的功能不会升级...最初安装的代码仍保留在机器上。从我们所做的测试和调查来看,我们认为这是因为 Burn 没有将 REINSTALL="ALL" 传递给 MSI 包(这就是上面的错误所说的)。
我们在 Rob 说你必须处理 OnPlanMsiFeature() 回调的地方发现了这个问题,我们正在正确地处理它。
wix pass option to msi for repair
由于上述错误自 2014 年 12 月以来一直存在,我们没有信心很快修复它,因此我们决定尝试寻找解决方法。到目前为止,我们的想法充其量只是骇人听闻,但在概念验证层面上,它显示了一些希望。我们正在复制整个 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 事件来检测次要升级。并使用该次要升级检测将每个 MsiPackage 的 RequestState 设置为 Local 或我们的 PlanPackageBegin 事件处理程序中的 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;
}
}
我们希望从其他 运行 遇到此错误的人那里得到一些指导,并在启用 EnableFeatureSelection 的情况下升级 Burn。我们的变通办法能解决问题吗?或者,有没有办法从自定义 BA 动态创建 MsiProperty,以便我们可以根据需要创建 REINSTALL=ALL?关于如何解决此问题,是否有人有其他更清洁 and/or 更可靠的想法?
如果您需要更多信息,请告诉我。我们已经与 Wix/Burn 合作几个月了,所以我们知道一些事情……但我们还不是专家。
如果您设置 EnableFeatureSelection="no"
,次要升级将按预期进行。也许可以将 "ADDLOCAL" 作为 MSIProperty 添加到您想要更新的功能,如 if you have EnableFeatureSelection="no"
. Also this post helped me 中。
几个月来,我们一直运行我最初问题中描述的"dual MSI"解决方案,而且它工作可靠。如果打开的错误得到修复,那么我们可以改变我们的方法。另外,如果有人有更好的答案,请告诉我。在那之前,我会将其标记为已回答。