Search code examples
wixinstallationheat

Can I optionally Include specific file extensions with Wix Heat using transforms?


Is it possible to include only certain file Extensions when using an xslt file to transform heat harvesting components using wix? I know I can exclude file extensions with the following:

<xsl:key name="exe-search" match="wix:Component[contains(wix:File/@Source, '.pdb')]" use="@Id" /> <!--.pdb-->

but is it possible to include several file types and exclude everything else (for example: .exe, .dll, .xml)?

Thank you!


Solution

  • Sure. Inside the condition, you can use full expressions, like:

       contains(wix:File/@Source, '.pdb') 
    or contains(wix:File/@Source, '.exe') 
    or contains(wix:File/@Source, '.dll') 
    or contains(wix:File/@Source, '.xml')
    

    If it's just an handful, that should be maintainable. To aid readability, you can put newlines inside the match attribute value (or any attribute in general).


    I would use it like this. Notice the poor man's ends-with trick.

    The template matches unwanted Components and replaces them with nothing.

    <xsl:stylesheet 
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:wi="http://schemas.microsoft.com/wix/2006/wi" 
        xmlns="http://schemas.microsoft.com/wix/2006/wi">
    
        <xsl:template match="wi:Component[not(
            contains(concat(wi:File/@Source,'|'), '.exe|') or
            contains(concat(wi:File/@Source,'|'), '.config|'))]">
         </xsl:template>
    
    
         <xsl:template match="node()|@*">
           <xsl:copy>
           <xsl:apply-templates select="@*"/>
           <xsl:apply-templates/>
           </xsl:copy>
         </xsl:template>
     </xsl:stylesheet>
    

    Here's a heat command that it works with:

    heat dir "%wix%\bin" -cg CompGroup -ag -t byext.xsl -o test.wxs