WiX删除文件的compont和componentRef

时间:2015-11-24 21:45:37

标签: xml xslt wix

使用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>

1 个答案:

答案 0 :(得分:0)

虽然来自Tim C的评论证明是有帮助的,但最终XSLT在语法上是正确的,并且只使用提供的位来完成它的工作,即使在Visual Studio中也是如此。但是,将解决方案应用于整个项目时,仍然无法删除.wxs输出的Project.Binaries部分的ComponentRef。

所以这个最终工作的解决方案是添加一个只包含删除代码的XSLT文件:

<Exec Command="&quot;$(Wix)Bin\heat.exe&quot; .... -t &quot;XSLT\XslRemoveConfig.xslt&quot;  ... " />

之后卸载并编辑Visual Studio中的.wixproj文件。找到为您的项目执行heat.exe的Exec命令。将-t开关添加到命令行,其中包含您所创建的xslt文件的位置。

RunSO

那就是它,你不必做任何其他事情,所有对.config文件的引用都将被删除,因此在运行.msi时不会安装它们。