Параметр запуска службы параметров в установщике WiX
У меня есть компонент ServiceInstall в установщике WiX, где у меня есть требование, чтобы запустить авто или запрос в зависимости от параметров, переданных в MSI.
Таким образом, рассматриваемый элемент XML
<ServiceInstall Vital="yes"
Name="My Windows Service"
Type="ownProcess"
Account="[SERVICEUSERDOMAIN]\[SERVICEUSERNAME]"
DisplayName="My Service"
Password="[SERVICEUSERPASSWORD]"
Start="demand"
Interactive="no"
Description="Something interesting here"
Id="Service"
ErrorControl="ignore"></ServiceInstall>
WiX не позволит использовать PArameter для атрибута Start, поэтому я застрял с полным дублированием компонента с условием, например, /
<Component Id="ServiceDemand"
Guid="{E204A71D-B0EB-4af0-96DB-9823605050C7}" >
<Condition>SERVICESTART="demand"</Condition>
...
и полностью дублируя весь компонент, с другой настройкой для запуска и другим условием.
Кто-нибудь знает более элегантное решение? Тот, где я не должен поддерживать 2 компонента, которые делают то же самое, кроме атрибута для начала?
2 ответа
Поле Start в таблице ServiceInstall не отформатировано, поэтому то, что вы вводите со свойством, не будет работать. Эта ссылка содержит несколько полезных советов, которые могут вам помочь: ServiceInstall - элемент Start. Похоже, у человека, который отправил сообщение, была та же проблема. Мое любимое предложение, которое они предлагают, заключается в создании настраиваемого действия, которое выполняется перед действием InstallServices, которое изменит значение элемента Start в таблице Service Install.
Обновление: изменена ссылка на предлагаемый сайт.
К сожалению, стандартная функциональность Wix для установки и управления сервисами довольно ограничена.
Хотя это и не идеально, но это можно сделать с помощью CustomAction, например, с помощью CAQuietExec (который также удобно сохраняет выходные данные в файл журнала установки, если вы его используете)
<CustomAction Id="QtExec_Install_Cmd" Property="QtExec_Install" Value="sc create [SERVICE_NAME] binPath="[INSTALLFOLDER]$(var.MAIN_EXECUTABLE)" start=[SERVICE_START_FLAG]" Execute="immediate" />
<CustomAction Id="QtExec_Install" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no" />
<CustomAction Id="QtExec_Uninstall_Cmd" Property="QtExec_Uninstall" Value="sc delete [SERVICE_NAME]" Execute="immediate" />
<CustomAction Id="QtExec_Uninstall" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no" />
<InstallExecuteSequence>
<Custom Action="QtExec_Install_Cmd" After="CostFinalize"/>
<Custom Action="QtExec_Install" After="InstallServices">&WindowsService=3</Custom>
<Custom Action="QtExec_Uninstall_Cmd" After="CostFinalize"/>
<Custom Action='QtExec_Uninstall' Before="RemoveFiles">NOT &WindowsService=3 AND NOT &WindowsService=-1</Custom>
</InstallExecuteSequence>
Замечания:
WindowsService - это название компонента
SERVICE_START_FLAG - это свойство, которое определяет, следует ли запускать службу
[INSTALLFOLDER]$(var.MAIN_EXECUTABLE) - это путь к исполняемому файлу
SERVICE_NAME - желаемое имя для службы Windows