Пользовательское действие Wix Rollback Quiet Execution не работает

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

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

(Значения вроде [# 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" />

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

Изменить 2

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

Это код

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

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

person Aaron    schedule 28.08.2014    source источник


Ответы (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 может справиться с этим изначально, как только вы проработаете эти детали.

person Christopher Painter    schedule 28.08.2014
comment
Спасибо, в этом есть смысл. Кажется, что установка, остановка и удаление службы выполняется правильно, но при ее запуске возникла проблема. Файлы уже помещены в файл wxs, собранный с помощью тепла, могу ли я сослаться на этот существующий компонент и добавить службу? - person Aaron; 29.08.2014
comment
Я также против любого динамического создания установщиков во время сборки. Сбор урожая, сканирование зависимостей, динамическое связывание файлов и так далее. Это редко бывает надежным или чистым. Wxs - это код ... просто напишите его как таковой. - person Christopher Painter; 29.08.2014
comment
Хорошо, сделаю это. Сбор урожая уже был отключен. Я не вижу разницы в Службах между этой установленной службой и самой Redis. В cmd тоже отлично работает, но не запускается как служба ... - person Aaron; 29.08.2014
comment
Я взял этот фрагмент из производственного кода, так что он должен работать. Это что-нибудь регистрирует? Одно различие между консольным приложением и службой - это рабочий каталог. Службы запускаются с System32. Но здесь это не должно быть проблемой, поскольку я знаю, что это работает. - person Christopher Painter; 29.08.2014
comment
Это просто общая ошибка диспетчера управления службами. Redis когда-нибудь регистрирует что-нибудь? Вы можете попробовать использовать [#filekey] в качестве аргумента файла конфигурации для службы. - person Christopher Painter; 29.08.2014
comment
Логов не вижу. Я тоже пробовал filekey, это путь: C: \ Program Files (x86) \ X \ Y \ redis-2.8.12 \ redis-server.exe --service-run C: \ Program Files (x86) \ X \ Y \ redis-2.8.12 \ redis.windows.conf --loglevel verbose. Хотя та же ошибка. - person Aaron; 29.08.2014
comment
так как выглядит ваш файл .conf? - person Christopher Painter; 29.08.2014
comment
Позвольте нам продолжить это обсуждение в чате. - person Aaron; 29.08.2014