如何在Wix中使用可配置的合并模块?

时间:2010-01-19 07:08:41

标签: installer wix windows-installer wix3

AFAIK就是这样做的:

产品:

<Merge Id ="HelpInstaller" SourceFile="HelpInstaller.msm" Language="1033" DiskId="1">
                <ConfigurationData Name="SurpressInstallation_Config" Value="&amp;HelpFeature"/>
 </Merge>

                      

合并模块:

<Property Id="SupressInstallation" Value='0'  />

<Substitution Table='CustomAction' Row='SetSupressInstallationProperty' Column='Target' Value='[=SupressInstallation_Config]'/>
<CustomAction Id='SetSupressInstallationProperty' Property='SupressInstallation'      Value='[SupressInstallation]'/>  
<InstallExecuteSequence>
  <Custom Action='SetSupressInstallationProperty' Before='RegisterHelp' />
  <Custom Action='RegisterHelp' After='CostFinalize'>(NOT Installed) AND (NOT UPGRADINGPRODUCTCODE) AND SupressInstallation = 3) </Custom>
</InstallExecuteSequence>

但是当我像上面那样做时我得到一个错误: 遇到“msmErrorDataRequestFailed”类型的意外合并错误,其中当前没有错误消息显示。

谁能告诉我如何解决这个问题?我基本上想要做的是仅在选择某个功能时才在合并模块中执行自定义操作。这是正确的方法吗?谢谢Daniel

3 个答案:

答案 0 :(得分:5)

您必须在模块下定义配置节点:

<Property Id="SupressInstallation" Value='0'  />
<Configuration Name="SupressInstallation_Config" Format="Text"/>
<Substitution Table='CustomAction' Row='SetSupressInstallationProperty' Column='Target' Value='[=SupressInstallation_Config]'/>
<CustomAction Id='SetSupressInstallationProperty' Property='SupressInstallation'      Value='[SupressInstallation]'/>  
<InstallExecuteSequence>
  <Custom Action='SetSupressInstallationProperty' Before='RegisterHelp' />
  <Custom Action='RegisterHelp' After='CostFinalize'>(NOT Installed) AND (NOT UPGRADINGPRODUCTCODE) AND SupressInstallation = 3) </Custom>
</InstallExecuteSequence>

答案 1 :(得分:1)

这听起来像个错误。你应该至少得到一个更具描述性的错误信息,解释出现了什么问题。请随意在http://wixtoolset.org/bugs

提交错误

答案 2 :(得分:0)

功能依赖于合并模块,而不是相反。合并模块中的任何内容都不应该引用合并模块之外的任何内容,例如ProductName,ProductCode或Feature名称,因为这会将合并模块紧密耦合到特定产品,而不是通用的可重用模块。这样做基本上会创建一个循环引用,并不是一个想法。

您可能需要的(在不知道更多信息的情况下很难说)是使用合并模块中某个组件的操作状态来处理您的情况。

例如,如果component1具有file1,并且在安装此组件/文件时需要触发customaction1,那么您将使用以下表达式:

$ component1 = 3 // INSTALLSTATE_LOCAL

这样,如果此合并模块合并到具有功能名称A,B或C的Product1,Product 2或Product3,则无关紧要,因为该关联位于组件级别。

如果您尝试绑定的功能是另一个功能,那么这一切都需要移动到另一个合并模块中,该模块将合并到该功能中。您可能需要创建要关联的虚拟组件。

现在,如果您想忽略所有这些建议,那么请查看功能操作状态操作符并紧密耦合。

Conditional Statement Syntax