WiX: InstallService условно, но установить файл безоговорочно - PullRequest
12 голосов
/ 13 августа 2010

В наборе инструментов Windows Install XML для установки службы мы группируем <ServiceInstall> с <File> в <Component>.Чтобы условно установить сервис, мы ставим <Condition> под <Component>.Однако если условие ложно, файл также не будет установлен.Если я поместил <File> в безусловный <Component>, то у службы нет пути к исполняемому файлу, и, следовательно, установка не удастся.Если я добавлю <File> в оба <Component>, будут найдены повторяющиеся символы.

Вопрос в том, можем ли мы установить службу условно, но установить соответствующий исполняемый файл безоговорочно?Спасибо!

Ответы [ 4 ]

6 голосов
/ 13 августа 2010

Создайте два компонента с разными идентификаторами GUID и идентификаторами и взаимоисключающими условиями: один для файла и службы, а другой только для файла.Примерно так:

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

Вы получите предупреждение LGHT1076, которое можно подавить, поскольку условия в компонентах являются взаимоисключающими.

2 голосов
/ 22 октября 2011

Если у вас есть только одна служба, вы можете указать действия службы в таблице InstallExecuteSequence.

В качестве альтернативы, вы должны запустить CA в течение немедленной фазы, которая временно удаляет запись из таблиц обслуживания перед выполнением во время отсрочки.

Я не фанат расщепления dll без причины.

1 голос
/ 14 августа 2010

Я пошел по этому пути, и он усложняется быстрее, чем можно было бы ожидать.

Я думаю, что у меня есть два компонента (несмотря на их взаимоисключающие условные выражения) с одним и тем же файлом ключей, но разными ресурсами ServiceInstall / Controlнарушение правил компонентов.

Способ, который я предлагаю сделать, - переместить всю вашу бизнес-логику в отдельный компонент DLL и создать два разных компонента EXE.Настройте одно как приложение консоли / Windows, а другое как приложение-службу.Свяжите компоненты с двумя различными функциями, чтобы конечный пользователь мог решить, каким образом он хочет настроить приложение.Затем пользователь может выполнить операцию изменения в программах добавления / удаления и использовать MSI, чтобы изменить свое решение и позже.

0 голосов
/ 12 июня 2018

Это навсегда, но у людей, как правило, один и тот же вопрос.

Способ сделать это с помощью современного WiX - это окружить начало сервиса условными конструкциями, например:

<?if $(var.Configuration) != Debug ?>
    <!--whatever stuff you want to do -->
<?endif?>

Таким образом, для этого случая вы должны установить файл вне условия, потому что вы всегда этого хотите, а внутри условия вы бы добавили свои ServiceInstall и ServiceControl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...