Wix Heat工具能否收割多文件夹文件?及分目录部署方案咨询
解决WIX Harvest拆分文件到不同部署目录的问题
嘿,我懂你现在的困扰——原本用heat一次性把整个目录的文件收割到同一个部署目录,现在要拆分9个文件到一个目录、剩下1个到另一个目录,还试过XSLT没成功。我给你两个实用的解决方案,你可以根据自己的场景选:
方案一:两次调用heat.exe(最简单直接)
既然要拆分文件,最直观的就是分两次收割:一次处理要放到第一个目录的9个文件,另一次处理单独的那个文件。你可以用heat的-filter参数精准筛选,或者直接指定单个文件(如果特殊文件名固定的话)。
示例命令:
- 收割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)"表示排除那个特殊文件。
- 收割单独的文件到目标目录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
相关产品推荐
相关产品推荐

