2010-08-13 14 views
9

In Windows Install XML set di strumenti, per installare un servizio, raggruppiamo <ServiceInstall> in un <Component> in uno <File>. Per installare il servizio in modo condizionale, inseriamo <Condition> sotto <Component>. Tuttavia, se la condizione è falsa, il file non verrà installato. Se inserisco lo <File> in un <Component> non condizionale, il servizio non ha un percorso file eseguibile e quindi l'installazione avrà esito negativo. Se inserisco lo <File> in entrambi <Component>, verranno trovati simboli duplicati.WiX: InstallService in modo condizionale, ma installare il file incondizionatamente

La domanda è, possiamo installare un servizio in modo condizionale, ma installare il file eseguibile associato incondizionatamente?

Grazie!

+1

Sarebbe davvero bello se l'attributo ServiceInstall/@ Start può essere impostato su [Proprietà], quindi è ancora possibile installare il servizio senza avviarlo. – Ivan

risposta

5

Creare due componenti con i diversi GUID e ID e condizioni reciprocamente esclusive: una per il file e il servizio e un'altra per il solo file. Qualcosa di simile a questo:

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

otterrete un avvertimento LGHT1076 che potrebbe essere soppressa in quanto le condizioni dei componenti si escludono a vicenda.

+0

Grazie al tuo consiglio, ho scoperto che quello che mi mancava era l'ID del file. Con ID diverso ma stesso nome, lo stesso file può esistere in diversi ''. –

+1

Che tecnicamente funziona ma riceverai errori di convalida ICE perché i due componenti hanno lo stesso keypath. Non è una soluzione pulita. –

1

Sono stato in questa strada e si complica più velocemente di quanto ci si aspetterebbe.

Ritengo di avere due componenti (nonostante le loro espressioni condizionali che si escludono a vicenda) con lo stesso file di chiavi ma diverse risorse ServiceInstall/Control una violazione della regola del componente.

Il modo in cui suggerisco di farlo è spostare tutta la logica aziendale in un componente DLL separato e creare due diversi componenti EXE. Impostane una come app console/windows e l'altra come app di servizio. Associare i componenti a due funzioni diverse in modo che l'utente finale possa decidere in che modo desidera configurare l'applicazione. L'utente può quindi eseguire un'operazione di modifica in Aggiungi/Rimuovi programmi e utilizzare MSI per cambiare idea anche in seguito.

2

Se si dispone di un solo servizio, è possibile condizionare le azioni di servizio nella tabella InstallExecuteSequence.

In alternativa, è necessario eseguire una CA durante la fase immediata, che rimuove temporaneamente la voce dalle tabelle dei servizi prima dell'esecuzione durante la differita.

Non sono un fan di dividere la DLL senza motivo.

+0

È la corretta progettazione dell'applicazione per scomporre il codice in più classi in più assiemi. Si crea un assembly con i componenti del server e si creano due assiemi da utilizzare come host di console e host di servizio. I suggerimenti che crei solo creano MSI di hack che non seguono le migliori pratiche. –

Problemi correlati