2014-08-28 2 views
1

Я хочу установить и запустить Redis (для Windows) как часть нашего программного пакета. Установка и запуск службы работают правильно, но во время установки происходит ошибка, после чего происходит откат, и после откат служба не удаляется.Wix Rollback Quiet Execution Пользовательское действие не работает

Может ли кто-нибудь помочь мне узнать, что я здесь делаю неправильно? Кроме того, нужны ли отдельные команды удаления, а также откатывание работы для удаления?

(значения, как [# fil5E85DBB2FFC8A2CFA55EDCADD8376C1F] являются идентификаторами генерироваться с HeatDirectory для Redis-server.exe и его каталог)

<!--Install Redis--> 
<CustomAction Id="SetRedisInstall" 
       Property="RedisInstall" 
       Value="&quot;[#fil5E85DBB2FFC8A2CFA55EDCADD8376C1F]&quot; --service-install &quot;[dir13BD3F7531FC8E0F30BB51FAA1B1357F]redis.windows.conf&quot; --loglevel verbose" /> 
<CustomAction Id="RedisInstall" 
       BinaryKey="WixCA" 
       DllEntry="CAQuietExec" 
       Execute="deferred" 
       Return="check" 
       Impersonate="no"/> 
<CustomAction Id="SetRedisStart" Property="RedisStart" Value="&quot;[#fil5E85DBB2FFC8A2CFA55EDCADD8376C1F]&quot; --service-start" /> 
<CustomAction Id="RedisStart" 
       BinaryKey="WixCA" 
       DllEntry="CAQuietExec" 
       Execute="deferred" 
       Return="check" 
       Impersonate="no"/> 

<!--Rollback Redis--> 
<CustomAction Id="SetRedisStop" Property="RedisStop" Value="&quot;[#fil5E85DBB2FFC8A2CFA55EDCADD8376C1F]&quot; --service-stop" /> 
<CustomAction Id="RedisStop" 
       BinaryKey="WixCA" 
       DllEntry="CAQuietExec" 
       Execute="rollback" 
       Return="ignore" 
       Impersonate="no"/> 
<CustomAction Id="SetRedisRemove" Property="RedisRemove" Value="&quot;[#fil5E85DBB2FFC8A2CFA55EDCADD8376C1F]&quot; --service-uninstall" /> 
<CustomAction Id="RedisRemove" 
       BinaryKey="WixCA" 
       DllEntry="CAQuietExec" 
       Execute="ignore" 
       Return="asyncWait" 
       Impersonate="no"/> 

<InstallExecuteSequence> 
    <!--Install Redis--> 
    <Custom Action="RedisInstall" Before="InstallFinalize">Not Installed</Custom> 
    <Custom Action="SetRedisInstall" Before="RedisInstall">Not Installed</Custom> 
    <Custom Action="RedisStart" After="RedisInstall">Not Installed</Custom> 
    <Custom Action="SetRedisStart" Before="RedisStart">Not Installed</Custom> 
    <!--Rollback Redis--> 
    <Custom Action="SetRedisStop" Before="RedisStop"></Custom> 
    <Custom Action="RedisStop" Before="RedisStart"></Custom> 
    <Custom Action="RedisRemove" Before="RedisInstall"></Custom> 
    <Custom Action="SetRedisRemove" Before="RedisRemove"></Custom> 
</InstallExecuteSequence> 

Редактировать У меня есть компонент

<Feature Id="Redis" Title="Redis" Level="1" > 
    <ComponentGroupRef Id="RedisWxs"/> 
</Feature> 

И теперь часть обслуживания:

<ServiceInstall Id="siRedisService" Description="Redis Service" DisplayName="Redis" Arguments="&quot;[dir13BD3F7531FC8E0F30BB51FAA1B1357F]redis.windows.conf&quot;" ErrorControl="normal" Name="Redis" Start="auto" Type="ownProcess" Vital="yes" Account="NT AUTHORITY\NetworkService"/> 
<ServiceControl Id="scRedisService" Name="Redis" Start="install" Stop="both" Remove="both" Wait="yes" /> 

Как добавить службу к существующему компоненту?

Edit 2

Я отключил сбор automatc и редактируюсь выходной файл, так что фиксирует ссылочную проблему. У меня все еще есть проблема, что служба Redis не может запускаться. Однако, когда я просто скопировать вставить путь (включая конфигурационный файл) в ЦМД, он отлично работает ...

Это код

 <Component Id="cmp911C50BAA696496834114926A958787D" Guid="*"> 
      <File Id="fil5E85DBB2FFC8A2CFA55EDCADD8376C1F" KeyPath="yes" Source="$(var.RedisPath)\redis-server.exe" /> 
      <ServiceInstall Id="siRedisService" DisplayName="Redis" Arguments="--service-run redis.windows.conf --loglevel verbose" ErrorControl="normal" Name="Redis" Start="auto" Type="ownProcess" Vital="yes" Account="NT AUTHORITY\NetworkService"/> 
      <ServiceControl Id="scRedisService" Name="Redis" Start="install" Stop="both" Remove="both" Wait="yes" /> 
     </Component> 
     <Component Id="cmpFC38C2953561FABFFCF29CCEC52692E1" Guid="*"> 
      <File Id="filF5607FB03CD4B203C699DA14D17FF53B" KeyPath="yes" Source="$(var.RedisPath)\redis.windows.conf" /> 
     </Component> 

Редактировать 3 - рабочий раствор

Была проблема разрешения, вот как я ее исправил:

 <Component Id="cmp911C50BAA696496834114926A958787D" Guid="*"> 
      <File Id="fil5E85DBB2FFC8A2CFA55EDCADD8376C1F" KeyPath="yes" Source="$(var.RedisPath)\redis-server.exe" /> 
      <CreateFolder Directory="dir13BD3F7531FC8E0F30BB51FAA1B1357F"> 
       <util:PermissionEx User="NT AUTHORITY\NETWORKSERVICE" GenericAll="yes" /> 
      </CreateFolder> 
      <ServiceInstall Id="siRedisService" DisplayName="Redis" Arguments="--service-run &quot;[#filF5607FB03CD4B203C699DA14D17FF53B]&quot;" ErrorControl="normal" Name="Redis" Start="auto" Type="ownProcess" Vital="yes" Account="NT AUTHORITY\NETWORKSERVICE"/> 
      <ServiceControl Id="scRedisService" Name="Redis" Start="install" Stop="both" Remove="both" Wait="yes" /> 
     </Component> 

ответ

1

Это очень много настраиваемых действий. Я бы избавился от них. Вот как я качусь:

<Component Id="redacted" Guid="redacted"> 
    <File Id="redacted" Source="$(var.SourceDir)\redis-server.exe" KeyPath="yes" /> 
    <ServiceInstall Id="siRedisService" Description="Redis Service" DisplayName="Redis" Arguments="--service-run redis.windows.conf --loglevel verbose" ErrorControl="normal" Name="Redis" Start="auto" Type="ownProcess" Vital="yes" Account="NT AUTHORITY\NetworkService"/> 
    <ServiceControl Id="scRedisService" Name="Redis" Start="install" Stop="both" Remove="both" Wait="yes" /> 
</Component> 
<Component Id="redacted" Guid="redacted"> 
    <File Id="redacted" Source="$(var.SourceDir)\redis.windows.conf" KeyPath="yes" /> 
</Component> 

Я говорил это много раз в прошлом ... услуга является услугой является услуга. Что-нибудь другое, кроме ServiceInstall и ServiceControl, а также случайный вход в реестр - это форма безупречного самопроверки. Сервисы могут быть написаны на разных языках и размещены в разных режимах работы, но их взаимодействие с API-интерфейсами диспетчера управления сервисами одинаково, и MSI может обрабатывать его изначально, как только вы будете обрабатывать эти детали.

+0

Спасибо, это имеет смысл. Похоже, что установка, остановка и удаление службы выполняется правильно, но есть проблема с ее запуском. Файлы уже размещены в файле wxs, собранном с помощью тепла, я могу ссылаться на этот существующий компонент и добавить службу? – Aaron

+0

Я редактировал, мое первое сообщение для большей ясности. – Aaron

+1

Я также против любого времени создания динамического авторинга установщиков. Урожай, сканирование зависимостей, динамическое связывание файлов и т. Д. Это редко надежный или чистый выигрыш. Wxs - это код ... просто напишите его как таковой. –

Смежные вопросы