You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wix Heat工具能否收割多文件夹文件?及分目录部署方案咨询

解决WIX Harvest拆分文件到不同部署目录的问题

嘿,我懂你现在的困扰——原本用heat一次性把整个目录的文件收割到同一个部署目录,现在要拆分9个文件到一个目录、剩下1个到另一个目录,还试过XSLT没成功。我给你两个实用的解决方案,你可以根据自己的场景选:

方案一:两次调用heat.exe(最简单直接)

既然要拆分文件,最直观的就是分两次收割:一次处理要放到第一个目录的9个文件,另一次处理单独的那个文件。你可以用heat的-filter参数精准筛选,或者直接指定单个文件(如果特殊文件名固定的话)。

示例命令:

  1. 收割9个文件到目标目录A(比如TARGETDIR\Docs\Guides):
&"$Env:WIX\bin\heat.exe" dir "$dirForPrintedGuides" -cg CG_SPI_PRINTED_GUIDES_MAIN -gg -sfrag -srd -sreg -var var.DocPrintedGuidesDir -dr DOC_GUIDES_MAIN -filter "!(SpecialFile.pdf)"

这里的-dr DOC_GUIDES_MAIN是你在主WXS里定义的第一个目标目录ID,-filter "!(SpecialFile.pdf)"表示排除那个特殊文件。

  1. 收割单独的文件到目标目录B(比如TARGETDIR\Docs\Special):
&"$Env:WIX\bin\heat.exe" file "$dirForPrintedGuides\SpecialFile.pdf" -cg CG_SPI_PRINTED_GUIDES_SPECIAL -gg -sfrag -srd -sreg -var var.DocPrintedGuidesDir -dr DOC_GUIDES_SPECIAL

这次用heat file直接指定单个文件,-dr指向第二个目标目录的ID。

之后在主WXS里分别引用这两个组件组就行:

<Feature Id="PrintedGuidesFeature" Title="Printed Guides" Level="1">
  <ComponentGroupRef Id="CG_SPI_PRINTED_GUIDES_MAIN" />
  <ComponentGroupRef Id="CG_SPI_PRINTED_GUIDES_SPECIAL" />
</Feature>

方案二:用XSLT转换修正heat生成的WXS文件

如果还是想用一次heat收割再调整,那大概率是之前的XSLT写法不对。下面给你一个针对性的XSLT示例,假设特殊文件叫SpecialFile.pdf,我们要把它的组件移到另一个目录引用下:

编写XSLT文件(比如SplitFiles.xslt):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi">
  <xsl:output method="xml" indent="yes" />

  <!-- 复制所有节点,除了要修改的部分 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <!-- 匹配特殊文件的组件,修改它的Directory属性 -->
  <xsl:template match="wix:Component[wix:File/@Source='var.DocPrintedGuidesDir\SpecialFile.pdf']">
    <xsl:element name="Component" namespace="http://schemas.microsoft.com/wix/2006/wi">
      <xsl:copy-of select="@*" />
      <!-- 替换成你的第二个目录ID -->
      <xsl:attribute name="Directory">DOC_GUIDES_SPECIAL</xsl:attribute>
      <xsl:apply-templates select="node()" />
    </xsl:element>
  </xsl:template>

  <!-- 把特殊文件的组件从原组件组拆分到新组 -->
  <xsl:template match="wix:ComponentGroup[@Id='CG_SPI_PRINTED_GUIDES']">
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <!-- 保留9个文件的组件引用 -->
      <xsl:apply-templates select="wix:ComponentRef[not(wix:Component/@Directory='DOC_GUIDES_SPECIAL')]" />
    </xsl:copy>
    <!-- 创建新组件组存放特殊文件 -->
    <wix:ComponentGroup Id="CG_SPI_PRINTED_GUIDES_SPECIAL">
      <xsl:apply-templates select="wix:ComponentRef[wix:Component/@Directory='DOC_GUIDES_SPECIAL']" />
    </wix:ComponentGroup>
  </xsl:template>
</xsl:stylesheet>

调用heat时指定XSLT:

&"$Env:WIX\bin\heat.exe" dir "$dirForPrintedGuides" -cg CG_SPI_PRINTED_GUIDES -gg -sfrag -srd -sreg -var var.DocPrintedGuidesDir -dr DOC_GUIDES_MAIN -xsl SplitFiles.xslt

生成的WXS文件里,SpecialFile.pdf的组件会自动指向第二个目录,组件组也会拆分成两个,之后在主WXS里引用这两个组即可。

小提示

  • 确保主WXS里已经正确定义了两个目标目录的ID,比如:
<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
    <Directory Id="INSTALLDIR" Name="MyApp">
      <Directory Id="DOCS" Name="Docs">
        <Directory Id="DOC_GUIDES_MAIN" Name="Guides" />
        <Directory Id="DOC_GUIDES_SPECIAL" Name="Special" />
      </Directory>
    </Directory>
  </Directory>
</Directory>
  • -gg参数会每次生成新的GUID,开发阶段用没问题;如果需要固定GUID,可以换成-g1或者手动指定。

内容的提问来源于stack exchange,提问作者Kris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:47:03