使用WiX 3.10:
我使用vdproj到WiX转换器工具,因为我们有几个需要快速更新的vdproj项目,并且没有时间从头开始手动完成这些工作。在vdproj项目中,我们使用排除过滤器* .config排除.config文件,但是,当项目转换为WiX时,这不会转换。所以我试图通过XSLT输出删除它们。
我已经看过几篇关于如何执行此操作的帖子,但是,ComponentRef部分不会被删除,只有Component。我的XSLT充其量是生锈的,这是我添加到XSLT中为项目输出进行转换的内容。
.......
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:key name="config-search" match="wix:Component[contains(wix:File/@Source, '.config')]" use="@Id" />
<xsl:template match="wix:Component[key('config-search', @Id)]" />
<xsl:template match="wix:ComponentRef[key('config-search', @Id)]"/>
.......
这就是我的开始
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="SearchSync.Binaries">
<Component Id="com_2DDFB814_CA3F_4E1F_8819_2249CB4C1377" Guid="{D07C7189-EFC9-4BA7-8E2F-9287333F2B4C}" Permanent="no" SharedDllRefCount="no" Transitive="no">
<File Id="_2DDFB814_CA3F_4E1F_8819_2249CB4C1377" DiskId="1" Hidden="no" KeyPath="yes" ReadOnly="no" System="no" Vital="yes" Source="$(var.SearchSync.TargetDir)\SearchSync.exe" />
</Component>
<Component Id="cmpE461B5F48229E9C8A0658DFAEF00FE18" Guid="{9B5BACCF-CCED-4649-AA82-1610C3414650}" Permanent="no" SharedDllRefCount="no" Transitive="no">
<File Id="fil441B326900F5FE7FF5BEA4BEEACF255C" DiskId="1" Hidden="no" KeyPath="yes" ReadOnly="no" System="no" Vital="yes" Source="$(var.SearchSync.TargetDir)\SearchSync.exe.config" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="SearchSync.Binaries">
<ComponentRef Id="com_2DDFB814_CA3F_4E1F_8819_2249CB4C1377" />
<ComponentRef Id="cmpE461B5F48229E9C8A0658DFAEF00FE18" />
</ComponentGroup>
</Fragment>
</Wix>
这就是我最终的结果。组件已删除,但ComponentRef未删除。 Component和ComponentRef的ID匹配。如何删除相应的ComponentRef?
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="SearchSync.Binaries">
<Component Id="com_2DDFB814_CA3F_4E1F_8819_2249CB4C1377" Guid="{D07C7189-EFC9-4BA7-8E2F-9287333F2B4C}" Permanent="no" SharedDllRefCount="no" Transitive="no">
<File Id="_2DDFB814_CA3F_4E1F_8819_2249CB4C1377" DiskId="1" Hidden="no" KeyPath="yes" ReadOnly="no" System="no" Vital="yes" Source="$(var.SearchSync.TargetDir)\SearchSync.exe" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="SearchSync.Binaries">
<ComponentRef Id="com_2DDFB814_CA3F_4E1F_8819_2249CB4C1377" />
<ComponentRef Id="cmpE461B5F48229E9C8A0658DFAEF00FE18" />
</ComponentGroup>
</Fragment>
</Wix>
答案 0 :(得分:0)
虽然来自Tim C的评论证明是有帮助的,但最终XSLT在语法上是正确的,并且只使用提供的位来完成它的工作,即使在Visual Studio中也是如此。但是,将解决方案应用于整个项目时,仍然无法删除.wxs输出的Project.Binaries部分的ComponentRef。
所以这个最终工作的解决方案是添加一个只包含删除代码的XSLT文件:
<Exec Command=""$(Wix)Bin\heat.exe" .... -t "XSLT\XslRemoveConfig.xslt" ... " />
之后卸载并编辑Visual Studio中的.wixproj文件。找到为您的项目执行heat.exe的Exec命令。将-t开关添加到命令行,其中包含您所创建的xslt文件的位置。
RunSO
那就是它,你不必做任何其他事情,所有对.config文件的引用都将被删除,因此在运行.msi时不会安装它们。