wix在使用heat自动生成wxs时添加windows服务组件

最近需要给安装包增加一个windows服务组件,按照我的理解,我以为只需要Product.wxs加一段如下的标签就可以了
1 <Componet Id="myservice">
2     <File Id="Service.exe" KeyPath="yes" Source="{Service.exe路径}">
3     <ServiceInstall Id="Installer" DisplayName="MyService" Name="MyService"/>
4     <ServiceControl Id="Control" Name="MyService" Start="install" Stop="both" Remove="uninstall"/>
5 </Componet>

 

但因为我这个项目包含的组件都是通过Heat.exe自动生成对应wxs文件的,而生成后的Service.wxs里面已经包含了我在上面需要引用的Service.exe。此时我再加上上面这段标签的话,会因为Service.exe被两个File标签重复引用而无法生成。

 

查了一圈最终找到了解决方案,让heat生成时特殊处理我的Service.exe,即修改Filter.xslt,增加如下标签
  <xsl:template match="wix:Component[contains(wix:File/@Source, 'Service.exe') and not(contains(wix:File/@Source, 'Service.exe.config'))]">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*" />
        <wix:ServiceInstall Id="Installer" DisplayName="MyService" Name="MyService"/>
        <wix:ServiceControl Id="Control" Name="MyService" Start="install" Stop="both" Remove="uninstall"/>
    </xsl:copy>
  </xsl:template>

 

这样一来,在Heat生成wxs的时候,会在match的文件,即Service.exe的Component内附加ServiceInstall等安装Windows服务的标签。

 

PS:如果组件内同时存在.exe和.exe.config的话,match条件需要像上面一样增加一个not(contains(wix:File/@Source, 'Service.exe.config'))],否则生成时会因为heat给两个文件都附加了相同的ServiceInstall标签而无法进行后续处理。如果没有.exe.config则不需要这个条件了
上一篇:单片机一种简便的printf调试方案。


下一篇:(十)OpenStack---M版---双节点搭建---Heat安装和配置