条件安装由多个功能共享的组件

时间:2013-02-03 11:04:28

标签: wix windows-installer

我的产品包含多个功能(A,B,C),所有功能都共享一个通用的Windows服务组件。 问题是有一个结束案例:如果只安装了一个特定功能(功能C),带有'legacy-mode'标志(某些属性保存在注册表中),那么这个windows-service组件要么不应该安装或其启动类型应从“自动”更改为“禁用”。我更喜欢禁用启动类型解决方案的“未安装”解决方案。

在所有其他情况下:除了此功能(C)之外安装了其他功能(A,B),或者未设置'legacy-mode'标志时 - 应安装Windows服务组件及其启动类型应设置为“自动” 如果重新配置产品,则应重新评估该条件,并对两种情况采取适当的措施。

问题在于,无法在windows-service组件条件中使用功能的安装状态,因为两个功能的安装状态和组件的条件都在相同的CostFinalize操作中进行评估(请参阅:{{3} }) 此外,使用自定义操作中删除组件的方法不起作用,因为无法从现有功能中删除非传递组件,除非这是主要升级(请参阅http://www.joyofsetup.com/2008/04/09/feature-states-in-component-conditions/

我可以将组件分离到它自己的不同功能,并尝试编写自定义操作,根据CostFinalize操作之后的其他功能的安装状态设置此功能的安装状态,但是接缝会使安装逻辑复杂化对于不同的场景(安装,重新配置,回滚,卸载)并使其更容易出错。

你会建议什么?

1 个答案:

答案 0 :(得分:0)

最终,我创建了一个子功能,其中包含仅包含windows-service组件的C功能,并且我使用在CostFinalize之后调度的两个MsiSetFeatureState自定义操作来控制其安装状态 - 一个用于在状态功能C中将状态设置为不存在安装或重新配置并设置'legacy-mode'标志,另一个设置状态为install-local,以防安装或重新配置功能C并且未设置'legacy-mode'标志。 Windows-service组件仍然在功能A,功能B和功能C的此子功能之间共享。这似乎工作得很好!