NSIS

Un article de Agora2ia.


logo.gif


Voir aussi la page NsisTutoriel


Sommaire

Fiche

Nom NSIS
Société Nullsoft
Site http://nsis.sourceforge.net/
Version 2.04 (depuis le 07/01/2005)
Prix Gratuit.
Catégorie Outil permettant de créer des installeurs / desinstalleurs de logiciels sous Windows.
Mots clefs Setup, install, installer, installeur, Windows, compréssion, déploiement, livraison, intégration continue.
WikiName EnvironnementDeDeveloppement, Installeur.


Présentation

NSIS, qui signifie « Nullsoft Scriptable Install System », est un outil qui permet de créer des installers / un-installers de logiciels sous Windows. Les installers générés sont ainsi compatibles avec les versions de Windows 95 / 98 / ME / NT / 2000 / XP / Server 2003.

NSIS permet de choisir la langue de son installation (parmi les 35 qu'il propose par défaut, facilement extensible) et même de faire des installeurs multilinqgues.

L'outil repose sur un langage de script relativement complet qui permet ainsi de réaliser toutes les opérations utiles pour une installation de logiciel.

Voici quelques unes des opérations simples :

  • Créer / copier / supprimer / renommer des fichiers ou des répertoires
  • Créer de raccourcis
  • Manipuler des clés dans la base de registres et définir des variables d'environnement
  • Lire / écrire des fichiers .INI
  • Etc...

... et des opérations plus complexes :

  • Télécharger des fichiers sur internet.
  • Customiser des fichiers de configuration.
  • Redémarrer la machine après installation.
  • Saisir des informations utilisateurs pour les exploiter (login, mot de passe, path...).
  • Etc...

Concernant l'interface graphique, NSIS fourni quelques dialogues parmi les plus courants au cours d'une installation (affichage de la license, demander le répertoire d'installation...). Depuis la version 2, NSIS inclu une nouvelle interface, appelée Modern, ressemblant aux assistants (Wizard) des dernières versions Windows. Cette nouvelle interface possède de nombreuses fonctionnalités permettant de réaliser des installeurs plus conviviaux et pratiques, en les étoffants de graphiques. De plus, le degré de personnalisation s'est encore amélioré : les dialogues, les champs, les culeurs, les images peuvent être personnalisés.

Il est également possible de définir à l'aide de macros le comportement et le Look & Feel de l'installer, ainsi que les différents panneaux qui seront affichés lors de l'installation.

Une fois le script formé, il faut le compiler avec le compilateur fourni par NSIS et le résultat de la compilation donne alors le setup de l'application, qui contient l'ensemble des ressources indiquées dans le fichier de script (éxecutable, code source, fichier de paramétrage, documents...).

Il existe des éditeurs de scripts qui permettent de générer et de compiler le code. HM NIS Edit et Venis IX sont deux éditeurs référencés par le site de NSIS. Ils proposent notamment une coloration syntaxique des mots clés du langage. Entre ces deux outils, HM NIS Edit se distingue en surlignant les lignes qui ne passent pas à la compilation, mais il offre surtout la possibilité de créer ses propres panneaux à l'aide d'un éditeur graphique.

NSIS permet de générer des installeurs de plus de 2 Go. Or depuis la version 2, une nouvelle méthode de compréssion est venue s'ajouter aux 2 autres déjà éxistantes (Zlib et Bzip2), avec un gain de 20%.

Une autre des fonctionnalités intéressantes de NSIS est la notion de plugin, qui lui assure une ouverture certaine et une évolutivité.

Au final, NSIS facilite l'intégration de projet, les livraisons et la construction automatique.

Enfin, il est « free for any use », y compris pour des utilisations commerciales, alors pourquoi se priver.


Exemple d'installer réalisé avec NSIS

Screenshot.png


Les fonctionalités

Cette traduction française de la liste originale est extraite du "Manuel Utilisateurs NSIS".

  • Technologie SuperPiMP™ (si avancée et si incroyable que nous ne vous le dirons jamais assez),
  • Génère des installations exécutables win32 comprenant tout en elles
  • Support de la compression des données zlib ou bzip2. L'installation peut tout compresser en un seul bloc, ou individuellement.
  • Support de la désinstallation (l'installation peut automagicalement générer la désinstallation).
  • Interface utilisateur personnalisable (fenêtres, police, arrière-plans, icônes, texte, encoches, images, etc.)
  • Interface de l'assistant classique ou moderne
  • Totalement multilingue, support de plusieurs langues pour une seule installation. Plus de 35 traductions sont disponibles.
  • Système de pagination vous permettant de configurer les pages de l'assistant en en ajoutant de nouvelles
  • Sélection utilisateur des composants installés, via une arborescence
  • Plusieurs types d'installations (habituellement Minimal, Normal, Complète), et une configuration personnalisée
  • Vérification interne optionnelle de l'installation en utilisant un CRC32.
  • Taille du surplus d'en-tête compressé approximativement de 20-40ko (dépendant des fonctionnalités activées, de l'algorithme de compression utilisé et ainsi de suite - avec les options par défaut, elle est de ~34ko).
  • Possibilité d'afficher une licence, en format texte ou RTF
  • Possibilité de détection du répertoire de destination depuis le registre, et de permettre à l'utilisateur de l'utiliser (ou d'en utiliser un autre)
  • Système de plugin simple d'utilisation (inclus des plug-ins pour créer des fenêtres personnalisées, pour se connecter à Internet, pour télécharger via HTTP, pour patcher des fichiers, pour appeler des API Win32, etc.)
  • L'installation peut aller jusqu'à 2Go.
  • Mode Silence optionnel pour des installations automatisées
  • Un préprocesseur avec support des symboles, des macros, de la compilation conditionnelle et des prédefines standards
  • Une expérience de codage superbe avec des éléments de PHP et d'assembleur (incluant des variables utilisateurs, une pile, un réel contrôle de flux, etc.)
  • Les installations possèdent leur propre machine virtuelle afin de vous permettre d'écrire du code supportant :
    • extraction de fichiers (avec des paramètres d'écrasement configurables)
    • copie/renommage/suppression/recherche de fichiers/répertoires
    • appel de plugins DLL
    • chargement/déchargement des contrôles DLL/ActiveX
    • exécution d'éxécutable (executions systèmes et options d'attente)
    • création de raccourcis
    • lecture/paramètrage/énumération/suppression de clés du registre
    • lecture/écriture de fichiers INI
    • lecture/écriture générique de fichiers texte
    • manipulation puissante des chaînes de caractères et des entiers
    • recherche de fenêtres basée sur les noms des classes ou sur les titres
    • manipulation de l'interface utilisateur (polices/textes)
    • envoi de messages Window
    • interaction utilisateur avec des boites de dialogues ou des pages personnalisées
    • branchements, comparaisons, etc.
    • vérification des erreurs
    • support de redémarrage, incluant la suppression ou le renommage au reboot
    • commandes agissant sur le comportement de l'installation (telles que afficher/cacher/attendre/etc)
    • fonctions utilisateurs dans les scripts
    • fonctions d'interaction pour une action de l'utilisateur
  • Totalement libre d'utilisation. Voir la licence...
  • ...

Le langage NSIS

Un fichier de script porte l'extension .NSI. Chaque ligne est traitée comme une commande. Pour indiquer un commentaire, il faut commencer la ligne avec un point virgule ';' ou un dièse '#'.

Il est possible de créer des fichiers header avec l'extension .NSH et de faire ensuite leur importation dans un autre fichier avec la macro

!include header.nsh.

Le fichier header peut servir à répartir le script sur plusieurs fichiers et à définir par exemple des macros ou des fonctions utiles pour plusieurs scripts.

Un script NSIS est décomposé en sections et fonctions :

  • Les sections servent à définir les différentes étapes de l'installation (ou de la désinstallation).
  • Les fonctions quant à elles peuvent être appelées à partir d'une section, ou à partir d'une autre fonction. Des fonctions du type Callback peuvent également être implémentées et être appelées sur des évènements précis : démarrage de l'installation, fin de la désinstallation, etc...

De manière générale, le langage est sensible à la casse : cela est à prendre en compte dans les noms utilisés.

Les variables

Elles sont forcément globales, et leurs nommenclature est sensible à la casse.

En plus des variables offertes par NSIS ($0 à $9 et $R0 à $0R9), on peut désormai définir ses propres variables avec le mot clef Var. Ainsi, pour définit deux variables ('Username' et 'Password'), on écrirait :

Var Username
Var Password

# ...

Function GenerateAutoConnectCmd
  FileOpen $0 $INSTDIR\AutoConnect.cmd w
  FileWrite $0 "net use Z: \\ad_cvs\partage /u:$Username $Password $\r$\n"
  FileClose $0
  
  ExecWait $INSTDIR\AutoConnect.cmd
FunctionEnd


Les labels

Le langage est basé sur la notion d'instruction de branchement, à savoir l'association label: et goto. Par défaut, les labels ne sont pas globaux, et sont donc restreints à leur portée de déclaration (séction ou fonction). Seuls les labels commençant par un point sont globaux et peuvent être appelés d'un tout autre endroit dans le script, à l'exception de la partie de désinstallation.

Les sauts relatifs

Ils ont l'avantage de ne pas induire la déclaration de labels, mais par contre, à mon sens, ils fragilisent énormément le code : si l'on ajoute une commande, il faut revoir les indices, que se soit avant, et même après (confère sauts d'indice négatif). En résumé, cette fonctionnalité est à ne pas utiliser.

Les pages

Concernant l'interface graphique, NSIS fonctionne sur la notion de page, qui correspond aux étapes de l'installation.

Les pages sont de deux types :

  • les built-in, qui reprennent les étapes classiques d'une installation et sont fournies par NSIS (avec des commandes pré-définies, et descallback),
  • et celles définies par l'utilisateur (e. g. InstallOptions).

A partir du script on peut contrôller :

  • l'ordre des pages,
  • l'apparence des pages,
  • et leur comportement.

Les sections

La définition d'un installeur peut se diviser en sections. Une section :

  • contient zéro ou plusieurs instructions,
  • peut éventuellement être désactivée par l'utilisateur.

Une section peut-être vue comme une fonctionnalité qui contiendrait plusieurs instructions. On peut alors offrir à l'utilisateur :

  • soit la liste des fonctionnalités optionnelles pour qu'il puisse en (dé)sélectionner,
  • soit la liste des types d'installation (full, light, ...) et attacher en interne les sections au type correspondant, une section pouvant être incluse dans plusieurs types (à priori, les fonctionnalités de l'installation light sont également incluses dans l'installation full).

Les sections peuvent être découpées en plusieurs sous-sections.

??? Interêt ??? :

  • découpage fonctionnel => sélection/désélection ?
  • réutilisation => différentes fonctions ?

Les fonctions

Les fonctions sont assez proches des sections dans la mesure où elles sont constituées de 0 ou plusieurs instructions.

Elles doivent être définies en dehors des sections et de toute autre fonction., mais peuvent être appelées (Call) depuis une section ou une autre fonction.

Function myFunction
    # some commands
FunctionEnd

Encore une fois, installeur et désinstalleur sont isolés l'un de l'autre : les sections et fonctions d'une des 2 parties ne peuvent appeler celles de l'autre partie.

Les callback quant à elles :

  • se définissent comme les fonctions,
  • mais leur nom doit commencer par un point ".",
  • et sont appelées implicitement par l'installeur, suite à un évènement (de navigation, de fin ou de début d'une phase d'installation, sur des contrôles d'IHM, ...).

Il faut savoir que certaines callback ne sont pas appelées quand l'installateur fonctionne en mode "silencieux" (voir le paragraphesur cette fonctionnalité).

Pour une liste de fonctions utilisateur : Category:Functions & Macros

Les attributs

Ils permettent de contrôler l'apparence et le fonctionnement de l'installeur. Ils peuvent être positionnés n'importe où dans le script, à l'exception des sections et fonctions, et ne peuvent pas être positionnés à partir de variables (à l'exception de $\n et $\r).

Caption peut être positionné :

  • dans PageEx pour positionner le nom de la page,
  • hors de PageEx pour positionner le nom de l'installeur.

Installation en mode silencieux

Il est possible de générer des installeurs "silencieux", à savoir :

  • ne nécessitant aucune intervention de l'utilisateur,
  • ne possédant donc aucune IHM.

Cette fonctionnalité a été mise en place pour les administrateurs réseaux qui peuvent ainsi installer ou désinstaller ce qu'ils veulent sans interaction et/ou interférence externe. Aussi pour permettre d'encapsuler plusieurs installeurs, mais de n'en livrer qu'un seul, qui en interne en joue plusieurs.

Cette fonctionnalité permet également d'automatiser l'exécution de l'installation et de l'installation, et ainsi de l'intégrer dans un processus d'intégration continue.

Un même installeur peut-être à la fois silencieux et non silencieux. On peut en effet paramétrer cela de plusieurs façons :

  • SilentInstall et SilentUninstall,
  • SetSilent
  • En passant l'argument /S (sensible à la casse) à la ligne de commande.

On peut ensuite utiliser la fonction IsSilent au cours de l'installation pour la conditionner (par exemple qu'une interaction utilisateur est attendue).

Dans le cas où l'on souhaite utiliser le mode silencieux pour de l'intégration continue, il faudra faire attention à ne pas (trop) dénaturer le fonctionnel de l'installateur, afin que le test sur le mode silencieux soit le plus proche possible du mode en fonctionnement non silencieux).

Notamment, il est à rappeler qu'en mode silencieux certaines callback ne sont pas appelées (comme les .onInit).

Parmi ces intéractions à contourner il y a les MessageBox. Elles possèdent le paramètre /SD qui permet de fournir une valeur par défaut, qui sera notamment utilisée en mode silencieux.

Autre fenêtre à inhiber, celle qui permet d'indiquer le répertoire d'installation. Dans ce cas, il est possible d'indiquer le répertoire à de la ligne de commande, via le paramètre /D, qui pourra donc être associé au paramètre /S.

Cela par exemple donner :

setup.exe /S /D=C:\Program Files\MyProgram

Divers

Il est possible de positionner les informations du binaire, celles accessibles dans le panneau propriétés.

Plugin Eclipse : EclipseNSIS


Tout d'abord, EclipseNSIS nécessite le Graphical Editing Framework (GEF) pour fonctionner : il faut donc l'installer avant EclipseNSIS, sinon ce dernier refusera de s'installer. Pour se faire, il faut :

  1. Télécharger la dernière version de GEF depuis le site : download ou directement la version 3.1.1
  2. Décompresser l'archive,
  3. Copier les répertoires features, plugins et readme dans le répertoire d'installation d'Eclipse, qui doit déjà contenir ces 3 répertoires : il faudra donc les écraser.


On pourra ensuite installer EclipseNSIS :

  1. Help > Software Updates > Find and Install > Search for new features to install, puis Next.
  2. New Remote Site... :
    1. Name : EclipseNSIS Update Site
    2. URL : http://eclipsensis.sf.net/update
    3. puis Finish.

Tarifs

Complétement gratuit, même pour un usage commercial !


Retours d'experience

<citation>Pour ma part on s'en est servi sur mon dernier projet (après avoir comparé plusieurs concurrents open-source), mais par contre on ne passait pas par les Wizard pour écrire les scripts. Ca permet vraiment de faire pas mal de choses. En fait, en plus des setup de livraison, on a même passé sous NSIS nos outils de développement (Ilog Views, Xerces, Doxygen,....) : ainsi on arrivait à reproduire rapidement un environnement de développement en quelques setup, y compris les variables d'environnement (NSIS permet notamment de positionner les variables d'environnement pour l'utilisateur ou pour la machine). Bref, imaginez qu'on vous livre une nouvelle machine à 14h57, et qu'environ quelques clicks plus tard vous êtes déjà en train de compiler le projet ! De l'utopie ?!... Non, la réalité !</citation> --JacquesCouvreur

<citation>Moi je m'en suis servi chez [...] pour installer mon plugin. Il s'agissait d'enregistrer une DLL COM, de demander des paramètres de configuration à l'utilisateur et de les stocker dans la base de registres. J'en suis très content : NSIS fait son boulot, et en plus il est gratuit. Le langage de script est un peu archaique, mais ça suffit. Heureusement, de nombreuses fonctions sont disponibles, ainsi que de nombreux plugins. Au début, le script parait un peu compliqué mais grâce aux exemples on arrive à se débrouiller. Ensuite, quand on connait, ça roule tout seul !</citation> --Vincent.


Thèmes connexes

  • Réalisation de setup d'installation des outils utilisés pour le développement pour la mise en place de l'environnement de développement lui même. Confrontation dans ce cas des outils comme VmWare.
  • Compétition ou intégration à des outils de ConstructionDeProjet comme Ant ou Maven.


Ressources

Sites


Outils

Conclusion

Apres discussion avec un de mes anciens collègues :

  • NSIS comme beaucoup d'autres installeur à son propre langage, ce qui est à la fois moins évident pour le néophyte, mais aussi souvent moins puissant.
  • Autre chose importante : la gestion des "update". On livre rarement (l'intégralité) du premier coup, ou tout simplement le client demande des évolutions : je ne connais pas le potentiel de NSIS à ce sujet. Nous livrions à chaque fois un nouveau setup, qui nécessitait de faire au préalable un "un-install" de la précédente version (A mon avis, cette fonctionnalité n'est pas entièrement de la responsabilité de l'outil, mais doit être envisagée dés la conception de l'application).
  • Enfin, à mon sens, la véritable solution est un outil de construction de projet qui intègre la génération du setup, comme Ant (voire Maven ;o)) en Java, ou Jam (équivalent à Make) en C++ (« jam install »). Pour l'avoir utilisé, Jam est certes très puissant, mais impose encore une fois son propre langage (barbare pour le coup) : je sais qu'il existe Scons, dont les scripts sont en... Python (OUAIIIIH !), mais je ne l'ai pas utilisé.