wix在使用heat自动生成wxs时添加windows服务组件
2024-09-04 00:12:09
最近需要给安装包增加一个windows服务组件,按照我的理解,我以为只需要Product.wxs加一段如下的标签就可以了
<Componet Id="myservice">
<File Id="Service.exe" KeyPath="yes" Source="{Service.exe路径}">
<ServiceInstall Id="Installer" DisplayName="MyService" Name="MyService"/>
<ServiceControl Id="Control" Name="MyService" Start="install" Stop="both" Remove="uninstall"/>
</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则不需要这个条件了
最新文章
- Proxy Pattern(Java动态代理和cglib的实现)
- DB2解除锁表
- 如何在ZBrush中将球体演变为头发
- 《JavaScript启示录》摘抄
- PHP 数组和对象的相互转化
- 14.6.3 Grouping DML Operations with Transactions 组DML操作
- 手机网站keyup解决方案
- Java基础---继承、抽象、接口
- 【Python3之迭代器,生成器】
- 理解WidowManager
- SQL Server 2008 R2中配置作业失败后邮件发送通知
- burnside+polya 整理
- ReentrantLock(重入锁)的使用
- Python2 - 基础2 - 数据类型和模块
- [UE4]C++中SpawnActor用法(动态创建Actor)
- Mac 10.12连接iSCSI硬盘软件iSCSI Initiator X
- dubbo服务引用与集群容错
- Mysql命令行访问
- tomcat 内存溢出原因分析及解决
- 004 Android XML文件常用五大页面布局方式