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