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égieTailleDépendancesCustomisation
PyInstaller bundle+15 MB (Python embarqué)AucuneComplète
Stub Python minimal~200 KBPython requisLimitée
7-Zip SFX module~300 KBAucuneMinimale

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.

📦
PRODUIT LIÉ
Universal Installer V2.0
← Retour au blog Article suivant →