2009-09-02 11 views
5

Estoy usando WixUIFeatureTree para ofrecer al usuario una opción de qué componentes de la aplicación que desea instalar ... Una de mis características tiene dos características opcionales, al menos una de las cuales debe estar instalada para que el programa funcione. No quiero obligar al usuario a instalar ninguno en particular, pero no entiendo cómo forzarlos a elegir al menos un.¿Cómo puedo requerir al menos uno de los dos componentes opcionales en WiX?

Aquí está la parte pertinente de mi actual 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> 

supongo que voy a necesitar algún tipo de acción personalizada insertada en el punto correcto de la secuencia que garantiza que uno o el otro está seleccionado para la instalación, pero no tiene ni idea de cómo hacerlo, o si es incluso correcto. ¡Toda ayuda apreciada!

Respuesta

2

Creo que lo que realmente quiere hacer aquí es poner una condición en el < Publicar elemento > para que el botón Siguiente no lo habilite hasta que se cumplan sus condiciones. Algo así como:

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

Lo que no sé es cómo establecer las condiciones en base a la cual se comprueban los componentes, sin embargo, tiene que haber alguna manera de hacerlo de manera que los componentes adecuados se instalan más adelante ..

+0

Sí, probaría esto primero. De lo contrario, no creo que WiX tenga un "cualquiera o" disponible. También podría tener una pantalla de diálogo personalizada donde el usuario tiene que seleccionar una opción u otra. – JasCav

+0

Me doy cuenta de que esta es una publicación antigua, pero gracias Jeff. Tu publicación me indicó la dirección correcta. Publiqué mi solución, basada en la tuya, como respuesta a continuación (la que me funcionó al menos, en WiX v3.7). –

0

No tengo tiempo para realizar una prueba técnica en este momento, pero solo quiero apuntar en la dirección de la propiedad INSTALLLEVEL. Es un concepto bastante contrario a la intuición relacionado con las selecciones de características. Básicamente, hay un INSTALLLEVEL general de la instalación, que es un número entre 1 y 32.767 y las características tienen cada una una propiedad de nivel de instalación, que es un número entre -32.767 y 32.767. Si el valor de nivel de instalación de una función es menor o igual que la propiedad INSTALLLEVEL del producto, la característica está activada: http://kb.acresso.com/selfservice/viewContent.do?externalID=Q103232

Generalmente se usa para establecer los estados de las funciones predeterminadas y deshabilitar las funciones ocultas en los sistemas operativos donde la función no está No es compatible. Sin embargo, es posible que pueda utilizar estas propiedades junto con una acción personalizada en el siguiente evento de botón del diálogo para aplicar la selección de al menos una de sus características.

Y sí, los diálogos de MSI en general no tienen sentido, y son muy complicados de trabajar. En algunos casos, he reemplazado un solo cuadro de diálogo en una secuencia con un cuadro de diálogo estándar de Windows para evitar las limitaciones en el concepto general de GUI de MSI.

Voy a pensar si hay una manera más fácil de hacer esto. Suena como esto es muy urgente, sin embargo, así que tal vez desee consultar con las comunidades de despliegue y leer algunos de los mejores lugares de despliegue:

+0

Tal vez http://www.tramontana.co.hu/wix/lesson2.php#2.1 también. –

+0

Sí, de hecho, estoy usando la función INSTALLLEVEL para establecer los componentes predeterminados (en realidad, elegir uno de los dos). Sin embargo, nada impide que el usuario los apague a los dos, que es lo que quiero lograr. –

+0

¿Qué le parece si oculta las características en el árbol de características y luego proporciona una opción de estilo de botón de opción en el siguiente cuadro de diálogo? Necesita algunos ajustes importantes en los diálogos de MSI para hacerlo, pero hay un artículo en Installsite sobre cómo hacerlo. Solo quiero preguntar antes de desenterrarlo. –

1

¿Qué le parece usar el estado de Característica como una condición?

Algo así como (& Opción 1 = 2) y (& Opción 2 = 2)

Aquí hay un enlace para una mejor comprensión:

MSI Advanced Custom Actions

+0

Esto es lo que terminé haciendo. Utilicé estados de características como condición para forzar una de las dos opciones al nivel 0 (sin instalar) –

4

me di cuenta que es una entrada antigua, pero esto he resuelto es cómo esto utilizando v3.7 WIX con la interfaz de usuario FeatureTree:

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

completa FeatureT ree reemplazar el código:

<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" /> 

Espero que esto ayude a alguien.

+0

Muy bien. Gracias por publicar. –

Cuestiones relacionadas