WIX : Trouver et utiliser le numéro de version d'une application après un Harvest

Utiliser le numéro de version d'un exécutable ou d'une DLL avec WIX Toolset n'a rien de bien compliqué. Il suffit de référencer le fichier en lui donnant un Id (exemple: IdDuFichier). On peut ensuite utiliser la syntaxe !(bind.FileVersion.IdDuFichier).

Exemple : avec un fichier dont l'Id est MyApp.exe.


<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">  
  <Product 
    Id="*"
    Name="MyApp"       
    Language="1034"
    Version="!(bind.FileVersion.MyApp.exe)" 
    Manufacturer="..."
    UpgradeCode="...">
  …

Dans la plupart des cas, tout va bien. Mais si le fichier est référencé via une tâche d'Harvest, l'Id est imprévisible.

Heureusement, il existe un solution simple : utiliser un transformation XML au moment de l'Harvest.

Exemple, avec une tâche HarvestDirectory


<Target Name="BeforeBuild">
  <HarvestDirectory Include="$(WebAppDir)">
    <DirectoryRefId>INSTALLFOLDER</DirectoryRefId>
    <ComponentGroupName>MyApp</ComponentGroupName>
    <PreprocessorVariable>var.AppDir</PreprocessorVariable>
    <SuppressRootDirectory>true</SuppressRootDirectory>
    <SuppressCom>true</SuppressCom>
    <SuppressRegistry>true</SuppressRegistry>
    <Transforms>transformations.xslt</Transforms>
  </HarvestDirectory>
</Target>

Le fichier transformations.xslt est placé à la racine du projet WIX. Il contient le code suivant :


<?xml version="1.0" encoding="UTF-8"?>
<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>

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

    <!-- Renommage de l'id de l'application pour pourvoir la retrouver facilement et connaitre sa version -->
    <xsl:key name="search-app" match="wix:File[contains(@Source,'MyApp.exe')]" use="@Id"/>
    <xsl:template match="wix:File[key('search-app',@Id)]">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="Id">MyApp.exe</xsl:attribute>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Ce fichier peut être modifié pour correspondre au besoin de chacun (changement de sélecteur, et Id affecté au fichier).

Jérémy Jeanson

Comments

You have to be logged in to comment this post.