WIX : Fixer une variable, en fonction d'une règle métier

Parfois, on peut être amené à fixer une variable de WIX ToolSet en fonction des propriétés d'un fichier, ou toute autre règle métier.

Pour mon exemple, je vais fixer le numéro de version de mon msi à partir d'une information "dérivée" du numéro de version d'un exécutable. Au lieu de prendre l'habituel Major.Minor.Buil.Revision, je vais prendre Major.Minor.Revision.0 (oui, il y a des entreprises qui ont ce genre de demande un peu folle).

Pour cela, il faut modifier le fichier wixproj, et y ajouter une tâche BeforeBuild. Dans celle-ci, il y aura:

  • Une tâche GetAssemblyIdentity chargée de récupérer les informations de l'exécutable.
  • La sortie de GetAssemblyIdentity initialisera une variable $AppIdentity.
  • Une variable $AppVersion sera construite à partir des différents composants de $AppIdentity.
  • Une tâche DefineConstants se chargera de définir une variable WIX var.AppVersion à partir de $AppIdentity.

Ce qui donne :


<Target Name="BeforeBuild">
    <GetAssemblyIdentity AssemblyFiles="..\MonApp\bin\$(Configuration)\MonApp.exe">
      <Output TaskParameter="Assemblies" ItemName="AppIdentity" />
    </GetAssemblyIdentity>
    <PropertyGroup>
      <AppVersion>$([System.String]::Join('.', $([System.Version]::Parse(%(AppIdentity.Version)).Major), $([System.Version]::Parse(%(AppIdentity.Version)).Minor), $([System.Version]::Parse(%(AppIdentity.Version)).Revision), 0 ))</AppVersion>
      <DefineConstants>...;AppVersion=$(AppVersion)</DefineConstants>
    </PropertyGroup>  
 </Target>

L'utilisation est ensuite un jeu d'enfant :


<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product
        Id="*" 
        Name="MonApp"
        Language="1034"
        Version="$(var.AppVersion)"
        Manufacturer="..."
        UpgradeCode="...">

Jérémy Jeanson

Comments

You have to be logged in to comment this post.