2010-08-13 17 views
9

En el conjunto de herramientas de instalación de Windows, para instalar un servicio, agrupamos <ServiceInstall> con <File> en <Component>. Para instalar condicionalmente el servicio, ponemos <Condition> bajo <Component>. Sin embargo, si la condición es falsa, el archivo no se instalará también. Si pongo el <File> en un <Component> incondicional, entonces el servicio no tiene una ruta de archivo ejecutable y, por lo tanto, la instalación fallará. Si pongo el <File> en ambos <Component>, se encontrarán símbolos duplicados.WiX: InstallService condicionalmente, pero instale el archivo incondicionalmente

La pregunta es, ¿podemos instalar un servicio condicionalmente, pero instalar el archivo ejecutable asociado incondicionalmente?

Gracias!

+1

Sería muy bueno si el atributo ServiceInstall/@ Start se puede establecer en [Propiedad], por lo que aún puede instalar el servicio sin iniciarlo. – Ivan

Respuesta

5

Cree dos componentes con los diferentes GUID y Id. Y condiciones mutuamente excluyentes: uno para el archivo y el servicio, y otro solo para el archivo. Algo como esto:

<Component Id="SvcComp" Guid="{YOUR-GUID}" SharedDllRefCount="yes"> 
    <Condition> SOME_CONDITION </Condition> 
    <File Id="SvcFile" Name="Service.exe" Source="Service.exe" Vital="yes" /> 
    <ServiceInstall Id="Svc" Name="Service" DisplayName="Service" Description="Service" Type="ownProcess" Start="auto" ErrorControl="normal" Vital="yes" /> 
    <ServiceControl Id="Svc" Name="Service" Stop="both" Remove="uninstall" Wait="yes" /> 
</Component> 

<Component Id="ExeComp" Guid="{YYOUR-GUID}" SharedDllRefCount="yes" > 
    <Condition> NOT SOME_CONDITION </Condition> 
    <File Id="ExeFile" Name="Service.exe" Source="Service.exe" Vital="yes" /> 
</Component> 

obtendrá una advertencia LGHT1076 que podría ser suprimida ya que las condiciones en los componentes son mutuamente excluyentes.

+0

Gracias a su consejo, descubrí que lo que me perdí es el Id. De archivo. Con Id diferente pero con el mismo nombre, el mismo archivo puede existir en diferentes ''. –

+1

Eso funciona técnicamente pero obtendrá errores de validación de ICE porque los dos componentes tienen el mismo recorrido de tecla. No es una solución limpia. –

1

He recorrido este camino y se complica más rápido de lo que cabría esperar.

Considero tener dos componentes (a pesar de sus expresiones condicionales mutuamente excluyentes) con el mismo archivo de claves pero diferentes recursos de ServiceInstall/Control una infracción de regla de componente.

La manera en que sugiero hacerlo es mover toda la lógica de su negocio en un componente DLL separado y crear dos componentes EXE diferentes. Configure uno como una aplicación de consola/Windows y el otro como una aplicación de servicio. Asocie los componentes a dos funciones diferentes para que el usuario final pueda decidir de qué manera quiere configurar la aplicación. El usuario puede hacer una operación de modificación en agregar/quitar programas y usar MSI para cambiar su opinión más tarde también.

2

Si solo tiene un servicio, puede condicionar las acciones de servicio en la tabla InstallExecuteSequence.

Como alternativa, debe ejecutar una CA durante la fase inmediata, que elimina temporalmente la entrada de las tablas de servicio antes de la ejecución durante el aplazamiento.

No soy partidario de dividir el dll sin ningún motivo.

+0

Es un diseño de aplicación adecuado para factorizar el código en múltiples clases en ensamblajes múltiples. Crea un ensamblaje que tiene los componentes del servidor y crea dos ensamblajes para actuar como un host de consola y un host de servicio. Las sugerencias que hace solo crean hack MSI que no siguen las mejores prácticas. –

Cuestiones relacionadas