Служба установки WiX 3.5 из Heat, требуется пользовательское действие?

У меня есть проект VS2010 WiX с основным файлом .wxs и пустым файлом .wxs. Пустой .wxs перезаписывается в событии перед сборкой проекта с использованиемheat.exe для сбора всего из консольного exe. У исполняемого файла есть хуки InstallUtil, и во времена проекта установки VS исполняемый файл был установлен как служба.

Я пытался использовать биты <ServiceInstall> в WiX, но когда я указал исполняемый файл и другие элементы для установки службы, свет пожаловался на коллизию между .exe в основном .wxs и .exe в сгенерированном .wxs. .

Я думаю, что пользовательское действие — не лучший способ выполнить установку службы, поэтому я пытаюсь преобразовать XSL, чтобы получить файл, который мне не нужен (это один файл из 100).

У моего XSL должна быть проблема, потому что он не соответствует/не фильтрует. Вот:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl"
    xmlns:Wix="http://schemas.microsoft.com/wix/2006/wi">

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>

<xsl:template match="
        Component[File/@Source='$(var.bindir)\servicehost.exe']"/
</xsl:stylesheet>

Части .wxs, которые мне нужно вырвать, выглядят так:

    ....
     <Component Id="cmpD64BE1790BFAF0F05DA37558F5D72572" Guid="{6C70DDC8-349B-4B66-A415-DE08E302C2A8}">
                    <File Id="fil24DFDFCA765C9A8BBB8854CE66AED0E8" KeyPath="yes" Source="$(var.bindir)\servicehost.exe" />
                </Component>
    ....
<ComponentRef Id="cmpD64BE1790BFAF0F05DA37558F5D72572" />
    ....

Каков наилучший способ сделать эту работу?

Спасибо.


person Snowy    schedule 11.08.2011    source источник
comment
аналогичный вопрос здесь: stackoverflow.com/questions/7906578/   -  person Adam Butler    schedule 12.12.2011


Ответы (2)


XML-элементы Wix находятся в пространстве имен, поэтому вам необходимо указать пространство имен в значении match.

Я решил ту же проблему, используя XSL для добавления элементов ServiceInstall и ServiceControl к фрагменту, сгенерированному heat:

<!-- Add the service install/control entries to mybinary.exe -->
<xsl:template match="wix:Component[contains(wix:File/@Source,'mybinary.exe')]">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*" />
        <wix:ServiceInstall Id="MyServiceInstall" DisplayName="[SERVICE_NAME]" Description="[SERVICE_DESC]" Name="MyService" Arguments="" ErrorControl="normal" Start="auto" Type="ownProcess" Vital="yes" Account="LocalSystem" />
        <wix:ServiceControl Id="MyServiceControl" Name="MyService" Start="install" Stop="uninstall" Remove="uninstall" />
    </xsl:copy>
</xsl:template>
person Kieron    schedule 23.03.2012
comment
Чтобы точно сопоставить двоичный файл (если у вас есть файл app.config с таким же именем), попробуйте следующую строку соответствия: ‹xsl:template match=wix:Component[wix:File[@Source='$(var.BinDir)\ двоичный.exe']]› - person Mo0gles; 27.07.2012

Создайте промежуточный каталог для файлов, которые вы хотите собрать с помощью Heat. Храните .exe-файл службы отдельно, чтобы вы могли вручную создавать ServiceInstall.

person Bob Arnson    schedule 11.08.2011
comment
Heat просматривает выходные данные службы bin\debug dir. Хотелось бы, чтобы был способ исключить шаблон файла из Heat. Хм. Может быть, есть способ использовать XSL для удаления исполняемого файла, чтобы я мог сохранить его в своем основном wxs? - person Snowy; 11.08.2011
comment
Вот почему я предложил создать промежуточный каталог, чтобы вы могли контролировать, что собирает Heat, без необходимости идти по маршруту XSL. - person Bob Arnson; 11.08.2011
comment
@dani-carbonell предоставил похожий ответ, избегая одновременно сложного преобразования и промежуточного каталога. - person CodeFox; 28.07.2014