Qu'est-ce qu'une archive SFX ?
Une archive SFX (Self-eXtracting) est un exécutable qui contient à la fois un extracteur et les données à extraire. L'utilisateur double-clique, choisit un dossier de destination, et le contenu est extrait sans outil tiers. C'est le format idéal pour distribuer des logiciels à des utilisateurs non techniques.
La différence entre un installateur MSI et une archive SFX : le MSI modifie le registre et intègre un désinstallateur. Le SFX extrait simplement des fichiers. Choisir le SFX pour les outils internes sans besoin d'installation système.
Deux stratégies de création
| Stratégie | Taille | Dépendances | Customisation |
|---|---|---|---|
| PyInstaller bundle | +15 MB (Python embarqué) | Aucune | Complète |
| Stub Python minimal | ~200 KB | Python requis | Limitée |
| 7-Zip SFX module | ~300 KB | Aucune | Minimale |
SFX via PyInstaller
La méthode recommandée : un extracteur Python compilé avec PyInstaller qui embarque toute la logique d'extraction et l'UI :
# universal-installer crée le SFX en une commande
universal-installer make-sfx --source dist/mon-logiciel/ --output MonLogiciel_v1.1_setup.exe --title "Mon Logiciel v1.1" --icon assets/icon.ico --default-dest "C:\MonLogiciel" --post-install scripts/post_install.bat --license LICENSE.txt --sign --cert-store MY
# Structure interne du SFX produit
MonLogiciel_v1.1_setup.exe (PE64 signé)
├── extracteur.py (compilé PyInstaller)
├── payload.uxc (contenu compressé AES-256-GCM)
├── manifest.json
└── icon.ico
SFX via Stub Python
Si Python est garanti sur les machines cibles, le stub Python est plus léger :
from universal_installer.sfx import SFXBuilder
builder = SFXBuilder(
source="dist/mon-logiciel/",
mode="stub", # ou "pyinstaller"
)
builder.set_metadata(
title="Mon Logiciel v1.1",
version="1.1.0",
publisher="TRUvector",
default_dest=r"C:\MonLogiciel"
)
builder.add_post_install_script("scripts/post_install.bat")
builder.set_license("LICENSE.txt")
output = builder.build("MonLogiciel_v1.1_setup.exe")
print(f"SFX créé : {output} ({output.stat().st_size // 1024 // 1024} MB)")
Personnaliser l'UI d'extraction
# sfx_config.json
{
"ui": {
"title": "Installation Mon Logiciel v1.1",
"banner_image": "assets/banner_installer.png",
"accent_color": "#ff6b35",
"show_license": true,
"show_progress":true,
"allow_custom_dest": true,
"shortcuts": [
{"type":"desktop", "target":"MonLogiciel.exe"},
{"type":"startmenu", "target":"MonLogiciel.exe", "folder":"TRUvector"}
]
}
}
Scripts post-install
# scripts/post_install.bat
@echo off
echo Configuration de l'environnement...
REM Créer les dossiers de données
mkdir "%APPDATA%\MonLogiciel\config" 2>nul
mkdir "%APPDATA%\MonLogiciel\logs" 2>nul
REM Copier la config par défaut
copy "%INSTALL_DIR%\config.default.json" "%APPDATA%\MonLogiciel\config\config.json"
REM Optionnel : installer comme service Windows
sc create "MonLogicielSvc" binPath="%INSTALL_DIR%\MonLogiciel.exe --service" start=auto
sc start "MonLogicielSvc"
echo Installation terminée.
exit /b 0
Signature Authenticode
# Signer le SFX produit
universal-installer sign MonLogiciel_v1.1_setup.exe --cert-store MY --timestamp http://timestamp.digicert.com --description "Mon Logiciel v1.1 — TRUvector"
# Vérifier la signature
universal-installer verify-sign MonLogiciel_v1.1_setup.exe
# → ✓ Signature valide — TRUvector — 2026-10-15
Conclusion
Universal Installer V2 génère des SFX professionnels en une commande : compressé UXC, chiffré AES-256-GCM, UI personnalisable, scripts post-install et signature Authenticode. Le mode PyInstaller est recommandé pour les machines sans Python ; le mode stub pour les environnements internes garantis Python. La taille overhead du SFX PyInstaller (~15 MB) est compensée par la suppression de toute dépendance externe.