如何在WiX中至少要求两个可选组件中的一个?

时间:2009-09-02 01:29:32

标签: installer wix wix3

我正在使用WixUIFeatureTree为用户提供他们想要安装的应用程序的哪些组件的选项...我的一个功能中有两个可选功能,其中至少必须安装一个以使程序正常工作。我不想强迫用户安装任何一个,但我不知道如何强迫他们选择至少一个

这是我当前WXS的相关部分:

    <Feature Id="Main" Title="Product Name" Level="1" Absent="disallow" Display="expand" AllowAdvertise="no"
             Description="This is the application, and is a required component"
             >
        <ComponentRef Id="Baseline" />
        <ComponentRef Id="Shortcuts" />
        <Feature Id="Option1" Title="Plugin #1" Level="2" Absent="allow" AllowAdvertise="no">
            <ComponentRef Id="Plugin1Component" />
        </Feature>
        <Feature Id="Option2" Title="Plugin #2" Level="3" Absent="allow" AllowAdvertise="no">
            <ComponentRef Id="Plugin2Component" />
        </Feature>
    </Feature>

我猜我需要在序列的正确位置插入一些自定义动作,保证选择一个或另一个进行安装,但不知道如何做到这一点,或者它是否均匀对。所有帮助表示赞赏!

4 个答案:

答案 0 :(得分:4)

我意识到这是一篇旧帖子,但这就是我使用带有UI FeatureTree的WIX v3.7解决这个问题的方法:

<Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">&amp;MyAppClientFeature=3 OR &amp;MyAppPrinterFeature=3</Publish>

完整FeatureTree覆盖代码:

<UI Id="WixUI_FeatureTreeCustom">
    <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
    <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
    <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />

    <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
    <Property Id="WixUI_Mode" Value="FeatureTree" />

    <DialogRef Id="ErrorDlg" />
    <DialogRef Id="FatalError" />
    <DialogRef Id="FilesInUse" />
    <DialogRef Id="MsiRMFilesInUse" />
    <DialogRef Id="PrepareDlg" />
    <DialogRef Id="ProgressDlg" />
    <DialogRef Id="ResumeDlg" />
    <DialogRef Id="UserExit" />

    <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>

    <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">NOT Installed</Publish>
    <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>

    <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
    <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="CustomizeDlg">LicenseAccepted = "1"</Publish>

    <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="1">Installed</Publish>
    <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg" Order="2">NOT Installed</Publish>
    <Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">&amp;MyAppClientFeature=3 OR &amp;MyAppPrinterFeature=3</Publish>

    <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="1">NOT Installed OR WixUI_InstallMode = "Change"</Publish>
    <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish>
    <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="3">Installed AND PATCH</Publish>

    <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>

    <Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="CustomizeDlg">1</Publish>
    <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
    <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
    <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
</UI>

<UIRef Id="WixUI_Common" />

我希望这可以帮助别人。

答案 1 :(得分:2)

我认为你真正想要做的是在&lt; Publish&gt;中加入条件。 “下一步”按钮的元素在满足条件之前不启用它。类似的东西:

<Publish Dialog="..." Control="Next" Event="NewDialog" Value="...">OptionalPkg1Selected OR OptionaloPkg2Selected</Publish>

我不知道的是如何根据检查的组件设置这些条件,但必须有一些方法来做到这一点,以便稍后安装正确的组件......

答案 2 :(得分:1)

如何将Feature状态用作条件?

类似(&amp; Option1 = 2)AND(&amp; Option2 = 2)

这是一个更好理解的链接:

MSI Advanced Custom Actions

答案 3 :(得分:0)

我现在没有时间进行技术测试,但只想指出INSTALLLEVEL属性的方向。这是一个与功能选择相关的反直觉概念。本质上,安装的总体INSTALLLEVEL是1到32,767之间的数字,每个功能都有一个安装级别属性,它是介于-32,767和32,767之间的数字。如果要素的“安装级别”值小于或等于产品的INSTALLLEVEL属性,则会启用该功能:http://kb.acresso.com/selfservice/viewContent.do?externalID=Q103232

通常,您可以使用此选项设置默认功能状态,并在不支持该功能的操作系统上禁用隐藏功能。但是,您可以在对话框的下一个按钮事件中使用这些属性以及自定义操作,以强制选择至少一个功能。

是的,MSI对话框一般没有意义,而且它们是复杂的工作方式。在某些情况下,我已经用一个常规的Windows exe对话框替换了序列中的单个对话框,以解决整个MSI GUI概念中的限制。

如果有更简单的方法,我会想一想。听起来这听起来非常紧急,所以也许你想查看部署社区并仔细阅读一些最好的部署站点: