【问题标题】:How can I disable a Wix component when a Feature is selected?选择功能时如何禁用 Wix 组件?
【发布时间】:2011-10-07 10:27:46
【问题描述】:

在 Wix 中选择功能时启用组件很容易。我想做相反的事情,除非选择给定的功能,否则将安装组件。原因是组件执行的配置更改在选择给定功能时不需要。

失败的实验:

我已经尝试在组件中使用条件:

<Component ...>
    <Condition>&Feature = 3</Condition>
    ...
</Component>

那行不通,因为apparently the feature states are not calculated at the point where the component conditions are evaluated

我还尝试使用自定义操作集在 CostFinalize 之前运行,以便设置可以在组件条件下测试的属性。这也不起作用:

<Custom Action="Transfer_Feature_State" Before="CostFinalize" />
<Custom Action="Transfer_Feature_State_Property" Before="MtpWeb_Features_LabManager" />
<Custom Action="Transfer_Feature_State_Feature" Before="MtpWeb_Features_LabManager" />

自定义动作运行时,特征状态仍然设​​置为-1,所以在CostFinalize之前还没有计算特征状态。

有没有办法根据功能选择禁用组件?

【问题讨论】:

  • 我考虑将我的配置更改移动到可以稍后安排的自定义操作,而不是使用Util:XmlFile,而是尽可能将所有内容保留在 Wix 脚本中。

标签: wix


【解决方案1】:

组件被组织成特征。这意味着默认情况下会安装功能中的所有组件。如果您不希望某个功能安装某个组件,您可以确保该组件不包含在该功能中。

您真正想要的是互斥的功能。基本上,包含该组件的功能只有在未安装其他功能时才能安装,反之亦然。

Windows Installer 不支持此操作,因此只能通过自定义操作来完成。 Basically, when the given feature is selected you can use MsiSetFeatureState function to make sure that the other feature which contains your component is not installed.

【讨论】:

  • 谢谢,我将在什么阶段安排此自定义操作以查看第一个操作的状态?我可以使用非用户可见的功能来做到这一点吗?
  • 您可以使用任何功能来做到这一点。可以在 CostFinalize 和 InstallInitialize 之间的任何位置安排自定义操作。
猜你喜欢
  • 2010-12-15
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
相关资源
最近更新 更多