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

Dan*_*elB 6 installer windows-installer wix wix3

AFAIK这样做:

产品:

<Merge Id ="HelpInstaller" SourceFile="HelpInstaller.msm" Language="1033" DiskId="1">
                <ConfigurationData Name="SurpressInstallation_Config" Value="&amp;HelpFeature"/>
 </Merge>
Run Code Online (Sandbox Code Playgroud)

合并模块:

<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>
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我得到一个错误:遇到类型'msmErrorDataRequestFailed'的意外合并错误,其中当前没有错误消息显示.

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

Ser*_*ekh 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>
Run Code Online (Sandbox Code Playgroud)


Chr*_*ter 0

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

您可能需要的(在不了解更多信息的情况下很难说)是根据您的条件使用合并模块中组件之一的操作状态。

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

$component1=3 //INSTALLSTATE_LOCAL

这样,如果此合并模块合并到具有功能名称 A、B 或 C 的 Product1、Product 2 或 Product3 中,则不会产生任何影响,因为关联是在组件级别的。

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

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

条件语句语法