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).