Windows Installer XML - présentation

1.Introduction

Windows Installer XML, ou WiX, est une boîte à outils permet de décrire une base de données d’installation MSI sous la forme de documents XML, de générér la base MSI correspondante (ou encore des MSM, MSP et MST), ou de regénérer des fichiers XML à partir d'un fichier MSI existant.

A la différence d'autres outils de génération de fichiers d'installation, seules les informations strictement nécessaires sont incluses dans le fichier MSI final ; la taille du fichier généré s'en trouve donc réduite d'autant.

La version actuelle est la version 3.9, disponible depuis décembre 2014.

Le site du projet est : http://wixtoolset.org/

Les projets WiX peuvent être manipulés dans les environnements de développement comme Visual Studio ou Sharp Develop, ou par l’intermédiaire d’un outil dédié comme WiX Edit.

2. Composants de la boîte à outil

WiX est composé d'un ensemble d'outils utilisables en ligne de commande :

  • Candle : préprocesseur e compilation des fichiers source (.wxs) en fichiers objet (.wixobj)
  • Light : liaison et attachement des fichiers objet pour création de la base d'installation MSI ; si nécessaire, Light créera les fichiers .cab et les incluera dans le MSI
  • Lit : combine plusieurs fichiers .wixobj pour créer des bibliothèques utilisables par Light
  • Dark : conversion de fichiers MSI ou MSM en fichiers source WiX
  • Heat : récupération d'un fichier, du contenu d'un dossier, d’un site web, pour l'incorporer à un projet WiX sous forme de composants
  • Insignia : permet d'ajouter dans la base d'installation les informations concernant les certificats digitaux utilisés pour signer les fichiers .cab
  • Melt : convertit un fichier MSM en fichiers source WiX
  • Torch : analyse les différences entre deux sources pour générer un fichier de transformation (.wixmst ou MST)
  • Smoke : validation des fichiers MSI ou MSM
  • Pyro : permet de générer un fichier MSP à partir d'un fichier de mise à jour .wixmsp et de fichiers de transformation .wixmst
  • WixCop : assure la conformité des fichiers source WiX

3. Les fichiers WiX

3.1 Généralités

Ce sont des fichiers portant l'extension ".wxs" pour les fichiers sources ou ".wxi" pour les ficheirs d'inclusion.

Ces fichiers sont validés par rapport au schéma XML de WiX, puis compilés pour donner des fichiers ".wixobj", et enfin liés pour produire la base de données d'installation ".msi" ou les autres types de fichiers qu'il est possible de produire.

Exemple simple :

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product 
      Id="5B096F77-3304-4955-B97E-9E900FEA77EA" 
      Language="1036" 
      Manufacturer="danard.net" 
      Name="Exemple Minimal" 
      Version="1.0.0" 
      Codepage="1252" 
      UpgradeCode="222E9A8E-261E-433A-95EF-9E718ED245F2">
    <Package 
      Description="Exemple Minimal" 
      AdminImage="no" 
      Comments="Logique d'installation pour 'Exemple Minimal'" 
      Compressed="yes" 
      InstallerVersion="200" 
      InstallPrivileges="limited" 
      Keywords="Installer" 
      Languages="1036" 
      Manufacturer="danard.net" 
      ReadOnly="default" 
      ShortNames="no" 
      SummaryCodepage="1252" 
      Platform="x86" />
    <UI />
    <Feature 
        Id="Feature1" 
        Level="1" 
        Absent="disallow" 
        AllowAdvertise="no" 
        ConfigurableDirectory="INSTALLDIR" 
        Description="Description de Fonction1" 
        Display="collapse" 
        InstallDefault="local" 
        Title="Fonction1" 
        TypicalDefault="install">
      <Feature 
          Id="Feature2" 
          Level="2" 
          Absent="disallow" 
          AllowAdvertise="no" 
          Description="Description de Fonction2" 
          Display="collapse" 
          InstallDefault="followParent" 
          Title="Fonction2" 
          TypicalDefault="install">
        <ComponentRef Id="Component2" />
      </Feature>
      <ComponentRef Id="Component1" />
    </Feature>
    <Directory 
        Id="TARGETDIR" 
        Name="SourceDir">
      <Directory 
          Id="ProgramFilesFolder">
        <Directory 
            Id="INSTALLDIR" 
            Name="danard.net">
          <Component 
              Id="Component1" 
              Guid="21E69E04-DE8A-4A6C-8FA8-FF4220DD8ED3">
            <File 
                Id="Texte_Exemple.txt" 
                Source="SourceFiles\Texte Exemple.txt" 
                DiskId="1" />
          </Component>
          <Directory Id="TmpFolder">
            <Component 
                Id="Component2" 
                Guid="8C893CBE-928A-4AC8-A475-EFA95824C589">
              <CreateFolder />
            </Component>
          </Directory>
        </Directory>
      </Directory>
    </Directory>
    <Media 
        Id="1" 
        Cabinet="Exemple.cab" 
        CompressionLevel="none" 
        EmbedCab="yes" />
  </Product>
</Wix>

3.2 Éléments de base

3.2.1 En-tête

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
...
</Wix>

Le schéma permet de décrire les fichiers de base de données Windows installer.

3.2.2 Propriétés globales

3.2.2.1 Product

<Product 
    Id="5B096F77-3304-4955-B97E-9E900FEA77EA" 
    Language="1036" 
    Manufacturer="danard.net" 
    Name="Exemple Minimal" 
    Version="1.0.0" 
    Codepage="1252" 
    UpgradeCode="222E9A8E-261E-433A-95EF-9E718ED245F2">
...
</Product>

Les éléments obligatoires sont les suivants :

  • Id : référence unique du produit (GUID)
  • Version : version du produit ; format : major.minor.build
  • Language : langue supportée pour les textes incorporés dans la base de données d’installation
  • Name : nom du produit
  • Manufacturer: nom de l'éditeur

Il est fortement recommandé d’ajouter :

  • UpgradeCode : code utilisé pour les mises à jour ultérieures

Les GUID doivent toujours être indiqués en majuscules.

Ce n'est pas le cas pour ceux générés dans Visual Studio lorsque cet environnement est utilisé pour gérer des projets WiX.

3.2.2.2 Package

<Package 
    Description="Exemple Minimal" 
    AdminImage="no" 
    Comments="Logique d'installation pour 'Exemple Minimal'" 
    Compressed="yes" 
    InstallerVersion="200" 
    InstallPrivileges="limited" 
    Keywords="Installer" 
    Languages="1036" 
    Manufacturer="danard.net" 
    ReadOnly="default" 
    ShortNames="no" 
    SummaryCodepage="1252" 
    Platform="x86" />

Cette partie permet essentiellement de renseigner les propriétés de la page « Summary » pour le fichier MSI :

  • Id : GUID référençant le package ; dans WiX 3.0, il est généré automatiquement lors de la compilation et donc peut être omis
  • Description : usuellement, on retrouve ici le nom du produit, avec la même valeur que dans « ProductName »
  • Comments : usuellement, donne le but du package d’installation, par exemple : « cette base de données d’installation contient la logique et les données nécessaires à l’installation de XYZ »
  • Manufacturer : éditeur ; usuellement, contient les mêmes données que « Manufacturer »
  • Keywords : contient usuellement « Installer » et toute autre valeur pouvant être utilisée dans une recherche
  • Platform : indique la plateforme matérielle supportée (1 seule)
  • Languages: indique la liste des langues supportées

« Platforms » et « Languages » sont combinés pour donner la valeur finale de « Template » sous la forme platform;langID,langID,…

  • InstallerVersion : version minimale de Windows Installer nécessaire à l'installation, sous la forme ‘n° de version majeur x 100 + n° de version mineur’
  • Shortnames : indique si la source d’origine utilise des noms de fichiers long ou courts
  • Compressed : indique si les fichiers inclus sont compressés ou non
  • AdminImage : indique si la source est un media d’origine ou une image créée par une installation ‘administrative’
  • InstallPrivilege : indique si une élévation de privilège est nécessaires pour installer ce package (Windows Vista et supérieur)
  • ReadOnly : indique si le package doit être ouvert en mode ‘lecture seule’
  • SummaryCodepage : indique le numéro ANSI de la page de code utilisée pour afficher les informations dans l’onglet « Summary »

3.2.2.3 Media

<Media 
    Id="1" 
    Cabinet="Exemple.cab" 
    CompressionLevel="none" 
    EmbedCab="yes" />

Cette partie concerne la façon dont le produit sera livré une fois la base d'installation produite :

  • Id : identifiant du media
  • Cabinet : nom du fichier CAB qui contiendra les fichiers ; devrait être laissé à blanc si aucun fichier CAB n’est utilisé
  • CompressionLevel : indique le niveau de compression à utiliser pour la création du fichier CAB
  • EmbedCab : indique s’il faut inclure le fichier CAB dans le MSI final

3.2.3 Fonctions, répertoires, composants, fichiers

3.2.3.1 Fonctions

Les fonctions (features) représentent les groupes logiques de fonctionnalités qui font partie du produit.

Elles peuvent être décomposées en sous-fonctions.

Chaque fonction ou sous-fonction regroupe les composants nécessaires à l’installation de cette fonction.

<Feature 
    Id="Feature1" 
    Level="1" 
    Absent="disallow" 
    AllowAdvertise="no" 
    ConfigurableDirectory="INSTALLDIR" 
    Description="Description de Fonction1" 
    Display="collapse" 
    InstallDefault="local" 
    Title="Fonction1" 
    TypicalDefault="install">
...
</Feature>
  • Id : identifiant de la fonction
  • Level : niveau de la fonction, pour indiquer dans quel type de cas d’installation elle est incluse ; la valeur sera comparée à INSTALLLEVEL
  • Absent : indique si l’utilisateur a l’option de sélection la non-installation de cette fonction depuis l’interface d’installation
  • AllowAdvertise : donne la possibilité de publier les états de cette fonction
  • ConfigurableDirectory : répertoire d’installation correspondant à la fonction, modifiable ; doit correspondre à une propriété ‘publique’ et est donc en majuscules
  • Description : description de la fonction
  • Display : indique l’état initial d’affichage dans l’arborescence des fonctions
  • InstallDefault : donne la localisation par défaut pour l’installation
  • Title : titre de la fonction
  • TypicalDefault : donne l’état par défaut de publication de la fonction

Pour chaque composant inclus dans la fonction, on retrouve un élément <ComponentRef> comportant l’ID du composant.

3.2.3.2 Répertoires

Le premier niveau commence toujours par la racine correspondant à « TARGETDIR », dont la valeur est par défaut celle de la propriété « SourceDir ».

La disposition des répertoires est indiquée par la hiérarchie des éléments <Directory> dans la structure XML.

<Directory 
    Id="TARGETDIR" 
    Name="SourceDir">
...
</Directory>
  • Id : identifiant du répertoire ; il est possible d’utiliser ici les noms prédéfinis de Windows Installer pour référencer les répertoires standard
  • Name : donne le nom du répertoire

La racine de l’arborescence est toujours TARGETDIR, la valeur associée pour Name étant alors obligatoirement ‘SourceDir’.

3.2.3.3 Composants

Un composant est un morceau de l'application ou produit qui doit être installé ; ce peut être un fichier, un groupe de fichiers, un objet COM, des clés de registre, ...
Le service d'installation gère la mise en place ou la suppression d'un composant dans son ensemble. Il identifie chaque composant par son GUID.

<Component 
    Id="Component1" 
    Guid="21E69E04-DE8A-4A6C-8FA8-FF4220DD8ED3">
...
</Component>
  • Id : identifiant du composant
  • Guid : identifiant unique du composant, utilisé pour référencer les éléments installés par ce composant sur le poste.
<Directory Id="TmpFolder">
  <Component Id="Component2" Guid="8C893CBE-928A-4AC8-A475-EFA95824C589">
    <CreateFolder />
  </Component>
</Directory>

Dans ce cas précis, <CreateFolder /> indique qu'il faut créer le dossier associé au composant, même si ce dossier est vide.

3.2.3.4 Fichiers

Les  fichiers sont associés à des composants ; ils doivent être regroupés de préférence de façon logique.

<File 
    Id="Texte_Exemple.txt" 
    Source="SourceFiles\Texte Exemple.txt" 
    DiskId="1" 
/>
  • Id : identifiant du fichier
  • Source : chemin d’accès au fichier lors du processus de construction du MSI
  • DiskId : indique le Media qui inclura le fichier ; ce paramètre peut être indiqué aussi au niveau du composant

3.3 Autres éléments

3.3.1 Système

3.3.1.1 Base de registre

Pour créer, modifier ou supprimer une ou des entrées de base de registre, il suffit d’ajouter l’élément <Registry> à un composant.

<Registry 
    Id="Reg1"
    Root="HKLM"
    Key="Software\danard.net"
    Name="Exemple"
    Action="write"
    Type="string"
    Value="[INSTALLDIR]"
/>
  • Root : ruche dans laquelle se trouve la clé de registre ; les valeurs possibles sont : HKLM, HKCU, HKCR
  • Key : clé de registre
  • Name : nom de la valeur
  • Action : action à effectuer sur la valeur ; peut être "append", "prepend", "remove", "write"
  • Type : type de valeur ;  peut être "string", "integer", "binary", "expendable", "multiString"
  • Value : valeur à stocker ; dansle cas du type "multString", les chaînes de caractères individuelles sont spédcifiées en ajoutant des éléments <RegistryValue>

Pour spécifier une association entre un type de fichier et une application, il suffit d’ajouter au composant un élément <ProgId>.

<ProgId 
    Id="danard.danard"
    Description="Fichier DANARD" >
  <Extension
      Id="danard"
      ContentType="application/danard" >
    <Verb
        Id="open"
        Sequence="10"
        Command="Open"
        Target="[FileId]"
        Arguments="%1"
    />
  </Extension>
</ProgId>

3.3.1.2 Variable d’environnement

Les variables d’environnement sont manipulées au sein d’un élément <Environment> associé à un composant.

<Environment
    Id="Env1"
    Action="set"
    Part="last"
    Separator=";"
    Name="DANARD"
    Permanent="no"
    System="no"
    Value="[TARGETDIR]"
/>
  • Action : peut être "set", "create", "remove"
  • Part : peut être "all" (pour remplacer une valeur par une nouvelle valeur), "first", "last" (spécifie où ajouter la valeur)
  • Separator : indique le symbole à utiliser quand Part est à égal à "first" ou "last"
  • Name : nom de la variable
  • Permanent : indique si la variable doit être supprimée à la désinstallation
  • System : indique s’il s’agit d’une variable d’environnement système ou non
  • Value : valeur à stocker dans la variable ; il n’est possible d’en spécifier qu’une seule par élément <Environment>

3.3.2 Divers

Dans les autres possibilités offertes, on trouve :

  • création de site web
  • installation de bases de données SQL
  • installation de services
  • création de compte utilisateur