Zu Beginn eines Entwicklungsprozesses muss man sich um vieles kümmern: Architektur, Konzepte und Verantwortlichkeiten sind nur ein kleiner Teil des Ganzen. Was dabei gerne vergessen wird, ist das eigentlich Wichtige: Wie kommt meine Anwendung später zum Nutzer? Anders formuliert: Wie installiert der Nutzer später meine Software auf seinem System? Wer komplexe Anwendungen entwickelt und diese auf bequeme Art und Weise ausliefern möchte, der stößt bei seiner Suche nach dem richtigen Hilfsmittel auf das WiX Toolset.
Im folgenden ersten Beitrag unserer neuen WiX Toolset Blog Serie werde ich vorstellen, was das WiX Toolset ist und warum es als simple Lösung für viele Anwendungsszenarien zu gebrauchen ist. In den folgenden Beiträgen werde ich auf speziellere Szenarien eingehen.
Die Agenda wird dabei wie folgt aussehen:
1: Hilfe, Ich brauche einen Installer! – Das WiX Toolset
2: Wie sieht das denn aus? – Das WiX Toolset UI
3: Wo war das noch gleich? – Shortcuts und Uninstall
4: Manuell starten war gestern – Autostart und Conditions
5: Access denied! – Permissions setzen leichtgemacht
6: Wie kommt das jetzt zum Kunden? – WiX Setups erstellen und verteilen
7: Mach was du willst! – Custom Actions implementieren
Das WiX Toolset
Als Erstes stellt sich die Frage: Warum soll ich das WiX Toolset nutzen? Es gibt doch durchaus noch Alternativen – ClickOnce, InstallShield oder dotNetInstaller, um nur drei zu nennen. Was ist also der Vorteil des WiX Toolsets? Der größte Vorteil liegt in der Anzahl der verfügbaren Funktionalitäten. Es ist nicht nur möglich einfache Installationsroutinen zu erstellen, die ausschließlich Dateien an die richtige Stelle kopieren. Es können auch komplexe Prozesse abgebildet und eigene Aktionen integriert werden. Das Ganze wird in XML Syntax abgebildet, wodurch ein einfaches Mergen in der Verionsverwaltung möglich ist.
Um ein WiX Toolset Projekt in Visual Studio in eine Solution zu integrieren, muss es vorher installiert werden. Auf der offiziellen Homepage des Projektes gibt es neben den Binaries auch einen Installer, um das WiX Toolset zu installieren. Nach einem Neustart von Visual Studio kann der Solution ein neues Setup Projekt hinzugefügt werden.
Aufbau eines Windows Installer XML Projektes
Eine der ersten Aufgaben beim Erstellen eines Installationsprojektes, ist das Strukturieren aller Dateien, die installiert werden sollen. Das Windows Installer XML Format gibt uns hier eine Vielzahl an Möglichkeiten an die Hand. Wie diese Möglichkeiten aussehen, wird im Folgenden dargestellt.
Zentraler Punkt eines WiX Projektes ist das Product Element. Das Product kann als Einstiegspunkt verstanden werden, unter dem sich weitere Elemente vereinen. Ein Pflicht-Element ist dabei das Package. Die an dieser Stelle eingetragenen Attribute sind später in den Eigenschaften der Installationsdatei einsehbar, beeinflussen aber auch die Ausführung dieser. Hier können beispielsweise Versionsnummern, Herstellerinformationen, aber auch die benötigten Rechte, um die Installation ausführen zu können, definiert werden.
Besondere Aufmerksamkeit sollte man dem Feature Element widmen. Damit lassen sich funktionale Unterscheidungen sauber trennen sowie später aus dem Installer ausklammern, ohne große Anpassungen vornehmen zu müssen. Ein Feature Element kann als “kleinste installierbare Einheit” gesehen werden. Unter ihr werden einzelne Komponenten aufgeführt, die gemeinsam installiert werden. Über das Level Attribut können Features von der Installation ausgeklammert werden. Somit lässt sich leicht steuern, welche Features installiert werden sollen. Dies kann theoretisch für verschiedene Lizenzen oder aber für während der Installation vom Nutzer an und abwählbare Features genutzt werden.
Ein weiteres, wichtiges Element ist das Media Element. Es gibt uns die Möglichkeit, die Dateien der Installation auf mehrere Cabinets aufzuteilen und somit beispielsweise Installationen auf mehrere Datenträger zu verteilen. Im Zeitalter der Software-Downloads besteht aber die Möglichkeit, innerhalb des Media Elements zu spezifizieren, dass alle Dateien in die erstellte *.msi eingebettet werden sollen und am Ende somit nur noch eine Datei ausgeliefert werden muss. Im folgenden Screenshot ist die Definition eines Product Elementes abgebildet.
Das WiX Toolset bietet uns die Möglichkeit, über einfache Verschachtelung von Directory Elementen den Installationspfad zu bestimmen. Dabei steht jedes Directory Element für einen Ordner in der Ordnerstruktur. Zur besseren Übertragbarkeit auf verschiedene Systeme, werden bestimmte Werte fest vordefiniert. So verweist das Directory Element mit der ID “WINDOWSVOLUME” auf jedem System auf die Installationspartition des aktuellen Windows-Betriebssystems. Eine komplette Auflistung der reservierten IDs finden sie hier. Um Elemente außerhalb des Products zu definieren, müssen diese unterhalb eines Fragment Elementes angeordnet werden.
Um die einzelnen Dateien, die installiert werden sollen, zu strukturieren, werden Component oder ComponentGroup Elemente, welche mehrere Component Elemente zusammenfassen, benutzt. Diese werden jeweils mindestens einem Feature zugeordnet. Component Elemente, welche keinem Feature zugeordnet wurden, erzeugen Link Errors und verhindern so einen erfolgreichen Build des WiX Projektes.
Um ein Component einem Feature zuzuordnen, wird im Feature ein ComponentRef beziehungsweise ein ComponentGroupRef Element angelegt, das auf die ID des Component, beziehungsweise des ComponentGroup Elements zeigt. Wichtig ist an dieser Stelle, dass die angesprochenen Elemente nicht in der gleichen Datei liegen müssen. Es ist also möglich, die Anwendungsarchitektur auch im Installationsprojekt abzubilden und so den dokumentationsaufwand zu minimieren.
Das Component Element selbst kann beliebig viele Elemente verschiedener Typen beinhalten. Das am häufigsten benötigte Element ist das File Element. Es dient zur Definition einer Datei, die während der Installationsroutine kopiert werden soll. Im hier gezeigten Beispiel, wird das Component Element unterhalb eines DirectoryRef Elementes angelegt. Dieses zeigt auf die ID eines oben angelegten Directory Elements.
Die hier aufgeführten Elemente erlauben es, einfachste Installationsdateien mit Hilfe des WiX Toolsets zu erstellen. Im Laufe der weiteren Blog-Serie, werden verschiedene Anwendungsszenarien betrachtet, die es nötig machen, tiefer in die Struktur von WiX Setups zu blicken.