Я хочу установить и запустить Redis
(для Windows) как часть нашего программного пакета. Установка и запуск службы работают правильно, но во время установки происходит ошибка, после чего происходит откат, и после откат служба не удаляется.Wix Rollback Quiet Execution Пользовательское действие не работает
Может ли кто-нибудь помочь мне узнать, что я здесь делаю неправильно? Кроме того, нужны ли отдельные команды удаления, а также откатывание работы для удаления?
(значения, как [# fil5E85DBB2FFC8A2CFA55EDCADD8376C1F] являются идентификаторами генерироваться с HeatDirectory для Redis-server.exe и его каталог)
<!--Install Redis-->
<CustomAction Id="SetRedisInstall"
Property="RedisInstall"
Value=""[#fil5E85DBB2FFC8A2CFA55EDCADD8376C1F]" --service-install "[dir13BD3F7531FC8E0F30BB51FAA1B1357F]redis.windows.conf" --loglevel verbose" />
<CustomAction Id="RedisInstall"
BinaryKey="WixCA"
DllEntry="CAQuietExec"
Execute="deferred"
Return="check"
Impersonate="no"/>
<CustomAction Id="SetRedisStart" Property="RedisStart" Value=""[#fil5E85DBB2FFC8A2CFA55EDCADD8376C1F]" --service-start" />
<CustomAction Id="RedisStart"
BinaryKey="WixCA"
DllEntry="CAQuietExec"
Execute="deferred"
Return="check"
Impersonate="no"/>
<!--Rollback Redis-->
<CustomAction Id="SetRedisStop" Property="RedisStop" Value=""[#fil5E85DBB2FFC8A2CFA55EDCADD8376C1F]" --service-stop" />
<CustomAction Id="RedisStop"
BinaryKey="WixCA"
DllEntry="CAQuietExec"
Execute="rollback"
Return="ignore"
Impersonate="no"/>
<CustomAction Id="SetRedisRemove" Property="RedisRemove" Value=""[#fil5E85DBB2FFC8A2CFA55EDCADD8376C1F]" --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=""[dir13BD3F7531FC8E0F30BB51FAA1B1357F]redis.windows.conf"" 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 "[#filF5607FB03CD4B203C699DA14D17FF53B]"" 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>
Спасибо, это имеет смысл. Похоже, что установка, остановка и удаление службы выполняется правильно, но есть проблема с ее запуском. Файлы уже размещены в файле wxs, собранном с помощью тепла, я могу ссылаться на этот существующий компонент и добавить службу? – Aaron
Я редактировал, мое первое сообщение для большей ясности. – Aaron
Я также против любого времени создания динамического авторинга установщиков. Урожай, сканирование зависимостей, динамическое связывание файлов и т. Д. Это редко надежный или чистый выигрыш. Wxs - это код ... просто напишите его как таковой. –