Créer un paquet *.exe evolué

Améliorer l’installation

Notre paquet Mozilla Firefox ESR est fonctionnel mais il n’est pas encore optimal.

  • le paquet exécute l’installation du logiciel même si le logiciel est déjà installé, il l’écrase dans tous les cas ;
  • le paquet ne vérifie pas la version du logiciel s’il est déjà installé ;
  • le paquet ne vérifie pas la version du logiciel s’il est déjà installé ;

Comme avec les MSI, nous résolvons ces problèmes en utilisant la fonction install_exe_if_needed.

Utiliser install_exe_if_needed

La fonction est sensiblement la même que celle utilisée pour les installeurs MSI, avec quelques différences :

  • la fonction nécessite l’ajout des flags silencieux en paramètre ;
  • la fonction nécessite l’ajout de la clé de désinstallation en paramètre ;

On modifie notre exemple Mozilla Firefox ESR en conséquence :

# -*- coding: utf-8 -*-
from setuphelpers import *

uninstallkey = []

def install():
    print('installing tis-firefox-esr')
    install_exe_if_needed("Firefox Setup 45.5.0esr.exe",
                          silentflags="-ms",
                          key='Mozilla Firefox 45.4.0 ESR (x64 fr)'
                          min_version="45.5.0"
                          killbefore="firefox.exe")
Liste des paramètres utilisables avec install_exe_if_needed
Paramètre Valeur par défaut Description
exe nom du fichier EXE à exécuter.
silentflags paramètres silencieux à passer en argument à l’installeur.
key None clé de désinstallation du programme.
min_version None version minimale au dessus de laquelle il mettra à jour.
killbefore [ ] liste des programmes à tuer avant de lancer l’installation.
accept_returncodes [0,3010] codes de retour autres que 0 ou 3010 acceptés en retour par la fonction.
timeout 300 durée d’attente maximale d’installation (en secondes).
get_version None valeur passée en paramètre pour le contrôle de version au lieu de celle retournée par la fonction installed_softwares.
remove_old_version False Permet d’enclencher automatiquement la suppression d’une uninstallkey identique avec une version précédente à celle mentionnée
force False Permet de forcer l’installation même si une uninstallkey avec une version identique est trouvée.

En conséquence, le paquet aura un comportement différent :

  • le logiciel Firefox s’installera uniquement si le logiciel n’est pas installé et si la version est strictement inférieure à 45.5.0, sauf si l’option --force est indiquée lors de l’installation du paquet ;
  • à l’installation, les processus firefox.exe en cours d’exécution seront terminés ;
  • la fonction ajoutera elle-même la clé de désinstallation, donc laisser uninstallkey vide ;
  • à la fin de l’installation, la fonction ira vérifier si l”uninstallkey est bien présente sur le poste et si la version est bien égale ou supérieure à 45.5.0, si ce n’est pas le cas, elle basculera le paquet en ERROR ;

Gérer la désinstallation

Cas particulier d’un dé-installeur non-silencieux

Dans ce cas particulier, un paquet utilisant install_exe_if_needed renseigne la clé de désinstallation, mais cette clé de désinstallation pointe vers un dé-installeur non-silencieux.

Il nous faut contourner le problème en utilisant une fonction qui va supprimer la clé de désinstallation à la fin de l’installation.

:emphasize-lines: 13

# -*- coding: utf-8 -*-
from setuphelpers import *

uninstallkey = []

def install():
    print('installing tis-firefox-esr')
    install_exe_if_needed("Firefox Setup 45.5.0esr.exe",
                          silentflags="-ms",
                          key='Mozilla Firefox 45.4.0 ESR (x64 fr)',
                          min_version="45.5.0",
                          killbefore="firefox.exe")
    uninstallkey.remove('Mozilla Firefox 45.4.0 ESR (x64 fr)')

def uninstall():
    print('uninstalling tis-firefox-esr')
    run(r'"C:\Program Files\Mozilla Firefox\uninstall\helper.exe" -ms')