NSIS vs. WiX – Zwei Installer im Vergleich

02.03.2016

Spätestens gegen Ende der Implementierungsphase eines Projekts stehen viele Entwickler vor der spannenden Frage, mit Hilfe welcher Installer Technologie sie ihre Software dem Nutzer zur Verfügung stellen wollen. Die Möglichkeiten sind dabei vielfältig. Zu den bekanntesten Vertretern gehören Inno Setup, InstallShield, Nullsoft Scriptable Install System (NSIS) und Windows Installer XML (WiX).

Auch bei der Entwicklung des calvaDrive SyncClients mussten wir uns für einen Installer entscheiden und haben uns vor allem mit den beiden letztgenannten (NSIS und WiX) beschäftigt.

 

Windows Installer XML

Ursprünglich wurde dieses Toolset zu Erstellung von Windows Installern von Microsoft entwickelt. Mittlerweile wurde es aber an die Outercurve Foundation übertragen. [1]

Ein wesentlicher Unterschied zu anderen Tools besteht darin, dass das WiX Toolset eine Windows Installer Datei (MSI) statt einer EXE Datei erstellt. Der Hauptvorteil von MSI Paketen ist neben deren Stabilität die leichte Verteilung in Netzwerken durch Administratoren.

Vor- und Nachteile des WiX-Toolsets im Vergleich:

  • Vorteile
    • MSI Standard (Properties können über die Kommandozeile geändert werden; Kommandozeilen Parameter sind für die meisten MSI Installer gleich)
    • Leichtes Deployment durch Systemadministratoren
  • Nachteile
    • Sehr spärliche, lückenhafte Dokumentation
    • Kaum hilfreiche Beispiele für komplexere Probleme
    • Sehr steile Lernkurve. Ein fundiertes Wissen in der Funktionsweise des Windows Installers ist nötig
    • Soll weitere Software im Installer mitgeliefert werden (z.B. das .NET Framework) muss ein Bootstrapper verwendet werden, der eine .EXE Datei erstellt. Hierdurch entfallen viele Vorteile des MSI Standards.

 

Nullsoft Scriptable Install System

Das Nullsoft Scriptable Install System wurde ursprünglich von der Firma Nullsoft entwickelt und steht mittlerweile unter der zlib/libpng Lizenz. [2]

  • Vorteile
    • Leichter Einstieg, Scriptsprache ist schnell erlernt
    • Große Community, viele Tutorials
    • Zahlreiche Plugins, die kaum Wünsche offen lassen und sehr viel Arbeit abnehmen. Plugin-Entwickler antworten bei Fragen meist recht schnell
    • Sehr hohe Anpassbarkeit an die eigenen Bedürfnisse
    • Installer Dateien sind sehr klein
  • Nachteile
    • Kein MSI Standard
    • Unschöne, unübersichtliche Scriptsprache

 

Installer-Einsatz bei doubleSlash

Wir haben uns zunächst wegen der Deployment Vorteile für das WiX Toolset entschieden, mussten aber leider sehr schnell feststellen, dass die Dokumentation nicht sehr ausführlich und lückenhaft ist und dass es kaum gute Tutorials gibt. Die Einarbeitung dauerte deshalb recht lange. Das Grundgerüst für den Installer stand trotzdem bald und die meisten Probleme konnten wir durch Recherchearbeiten relativ schnell lösen.

Es gab jedoch auch Probleme, für die wir auch nach längerem Suchen keine Lösung fanden und die uns schließlich zwangen, auf den NSIS Installer umzusteigen.

Shell Icon OverlaysFür den calvaDrive SyncClient haben wir eigene Shell Icon Overlay Handler umgesetzt, die es erlauben, im Windows Explorer Icons über Dateien und Ordnern anzuzeigen. Hierdurch wird dem User eine direkte Rückmeldung gegeben, ob seine Dateien und Ordner bereits synchronisiert wurden und sicher in der Cloud liegen.

Der calvaDrive SyncClient sollte standardmäßig nur für den aktuell angemeldeten User installiert werden (per User Installation) und somit keine Administrationsrechte benötigen. Die Shell Icon Overlay Handler werden allerdings in der Windows Registry im Key HKLM, also für alle User eingetragen. Hierfür werden Administrationsrechte benötigt.

 

 

Hieraus wurden folgende Anforderungen an den Installer abgeleitet:

  • Ein Benutzer ohne Administrationsrechten startet den Installer

    • Der Benutzer wird gefragt, ob er sich mit Administrationsrechten einloggen will, um alle Funktionen (Shell Icon Overlays) des SyncClients nutzen zu können. Stimmt der Nutzer zu, so kann er die Nutzerdaten direkt eingeben und das Programm wird inklusive Shell Icon Overlays installiert. Verneint der Benutzer allerdings, so wird der SyncClient trotzdem installiert, allerdings ohne Shell Icon Overlays

  • Ein Benutzer mit Administrationsrechten startet den Installer

    • Der calvaDrive SyncClient wird inklusive aller Features installiert

Diese Anforderungen konnte nicht mit dem WiX Toolset umgesetzt werden. Wurde der Installer mit Administrationsrechten gestartet, wurden die Shell Icon Overlays grundsätzlich installiert, ansonsten nicht. In vielen Forenbeiträgen ist zu lesen, dass „Per User“ Installationen grundsätzlich zu vermeiden sind, da sie häufig zu Problemen u.a. mit der Benutzerkontensteuerung führen.

Da wir das beschriebene Problem über einen längeren Zeitraum nicht lösen konnten wechselten wir zum NSIS Installer. Die IDE HM NSIS EDIT bietet die Möglichkeit, einen einfachen Installer über einen Wizard zusammenzuklicken. So hatten wir schnell ein Grundgerüst erstellt. Die Portierung des WiX Installers gestaltete sich ebenfalls nicht schwer und wurde innerhalb eines Tages erledigt.

Der größte Vorteil lag für uns in dem sehr breiten Pluginangebot. So bot uns das UAC (User Account Control) Plugin genau die Funktionalität, um unsere Anforderungen umzusetzen. Das folgende Listing zeigt das von uns erstellte zugehörige Script:

RequestExecutionLevel user ; << Required, you cannot use admin!

Var installIconOverlays
Var silentmode

;UAC prompt. Decision whether to continue with or without admin rights.
!macro Init msg
StrCpy $installIconOverlays "yes"

StrCpy $silentmode "false"

IfSilent 0 +2
	StrCpy $silentmode "true"

${If} $silentmode == "false"
	uac_tryagain:
	!insertmacro UAC_RunElevated
	${Switch} $0 ;win32 error code
	${Case} 0 ;success
		${IfThen} $1 = 1 ${|} Quit ${|} ;started elevated child process, the current process should act like a wrapper (call quit without any further processing)
		${If} $3 <> 0
			  StrCpy $installIconOverlays "yes"
			  ${Break} ;we are admin, let the show go on
		${EndIf}
		${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user. you should call runElevated again
			MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND|MB_DEFBUTTON1 "$(${msg})" /SD IDYES IDNO uac_tryagain IDCANCEL cancel1
			StrCpy $installIconOverlays "no"
			${Break}
			cancel1:
			Quit
		${EndIf}
		;fall-through and die
	${Case} 1223 ;user aborted
		MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND|MB_DEFBUTTON1 "$(${msg})" /SD IDYES IDNO uac_tryagain IDCANCEL cancel2
		StrCpy $installIconOverlays "no"
		${Break}
		cancel2:
		Quit
	${Case} 1062 ;fatal
		MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Logon service not running, aborting!"
		Quit
	${Default}
		MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND|MB_DEFBUTTON2 "$(unableToElevateError) $0. $(unableToElevateContinue)" /SD IDIGNORE IDRETRY uac_tryagain IDABORT cancel3
		StrCpy $installIconOverlays "no"
		${Break}
		cancel3:
		Quit
	${EndSwitch}
${EndIf}

SetShellVarContext current  ; per User
!macroend

 

Eine vollständige Liste der verwendeten Plugins:

  • UAC Plugin
    • Fragt den Nutzer, ob er den Installer mit Adminrechten starten möchte. Wenn ja, startet es einen inneren Prozess mit Adminrechten.
  • UserMgr Plugin
    • Fragt den Benutzernamen ab
  • LockedList Plugin
    • Prüft, ob ein angegebener Prozess läuft, und schließt diesen (z.B. vor Deinstallation)
  • DotNetChecker Plugin
    • Zum Installieren der benötigten Version des .NET Frameworks
  • StdUtils Plugin
    • Benötigt für DotNetChecker
  • VersionCompare
    • Prüft beim Update, ob die selbe Version oder eine neuere Version bereits installiert ist

 

Fazit

Beide Installer haben ihre Vor- und Nachteile. Die Lernkurve ist bei WiX allerdings viel steiler. Der Einstieg gestaltet sich schwerer. Ein sehr einfacher NSIS Installer ist mit Hilfe des IDE Wizards in null Komma nichts umgesetzt. Durch die Pluginfunktionalität lässt sich der Installer schnell an die eigenen Bedürfnisse anpassen. Wir bereuen den Wechsel auf den NSIS Installer nicht und werden auch weitere Projekte damit realisieren.

Wer den calvaDrive SyncClient Installer in Aktion sehen will, kann ihn sich hier herunterladen.

 

Quellen:

[1] https://de.wikipedia.org/wiki/Windows_Installer_XML

[2] https://de.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System

 

calvaDrive - die Cloud für Unternehmen

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*