Dnešní článek bych rád věnoval jednomu zajímavému nástroji, s kterým jsem měl tu čest se setkat na jednom z projektů, na kterých pracujeme. Jedná se WIX, který slouží k vytváření klasických MSI windows instalátorů. Pomocí konfiguračního XML, které vytvoříte, můžete velice snadno vytvářet sofistikované instalátory pro vaše produkty. V tomto díle se zaměříme především na jeho představení a ukázku práce s ním.

Úvod

Hlavním cílem WIXu(LINK) je poskytnout jazyk a nástroje pro převod tohoto jazyka na MSI instalátor. Využívá k tomu služeb .NET frameworku, proto je třeba aby byl při vytváření instalátoru k dispozici. Pro samotnou instalaci pak již není nutný. WIX poskytuje nástroje pouze pro příkazovou řádku, ale existuje samostatný projekt WixEdit (LINK), který nabízí pohodlné GUI prostředí pro tvorbu instalátoru (vhodný především pro ty, kteří začínají úplně od začátku, či neznají plně samotný XML formát). WixEdit umí mimo všechny základní úpravy v XML také vytvářet custom dialogy (nestandardní okna v průběhu instalace) podobně jako například v Delphi, čím výrazně usnadňuje práci.

WIX nabízí tyto nástroje (zmíněny pouze ty, které jsem použil):

  • Candle – z XML vytvoří soubory .wixobj, které poté slouží k samotnému vytvoření MSI balíčku
  • Light – z souborů .wixobj vytvoří MSI balíček
  • Dark – z MSI balíčku vytvoří zpět XML soubor(y)
  • WixUIExtension – knihovna, která se používá při vytváření instalátoru; obsahuje standardní okna, která se zobrazují během instalace (úvodní obrazovka, schvalování licence, výběr typu instalace, výběr instalačního adresáře, finální obrazovka atd.)

Ukažme si nyní základní strukturu XML souboru, který slouží pro generování MSI balíčku – použil jsem ukázkový soubor z WIX distribuce:

<Wix xmlns='https://schemas.microsoft.com/wix/2003/01/wi'>
<Product Id='12345678-1234-1234-1234-123456789012' Name='Test Package'
       Language='1033' Version='1.0.0.0' Manufacturer='Microsoft Corporation'>
  <Package Id='12345678-1234-1234-1234-123456789012' Description='My first Windows
          Installer package' Comments='This is my first Windows Installer database'
          InstallerVersion='200' Compressed='yes' />
  <Media Id='1' Cabinet='product.cab' EmbedCab='yes' />
  <Directory Id='TARGETDIR' Name='SourceDir'>
    <Directory Id='ProgramFilesFolder' Name='PFiles'>
      <Directory Id='MyDir' Name='TestProg' LongName='Test Program'>
        <Component Id='MyComponent' Guid='12345678-1234-1234-1234-123456789012'>
          <File Id='readme' Name='readme.txt' DiskId='1' src='readme.txt' />
        </Component>
      </Directory>
    </Directory>
  </Directory>
  <Feature Id='MyFeature' Title='My 1st Feature' Level='1'>
    <ComponentRef Id='MyComponent' />
  </Feature>
</Product>
</Wix>

Před samotným začátkem popisu tohoto XML souboru je třeba zmínit se GUID. Tento řetězec je jednoznačným identifikátorem každé komponenty (komponenta je každá součást instalace – od produktu samotného až po jednotlivé soubory). Toto GUID musí být vždy ve správném formátu a musí být na daném systému unikátní – podle něho instalační služba Windows rozeznává jednotlivé nainstalované součásti.

A nyní už k příkladu samotnému – je to minimalistický příklad a obsahuje pouze ty nejzákladnější prvky, které musí v každém WIX XML být. Prvním z nich je Product, ten zaobaluje všechny ostatní a identifikuje vámi instalovaný produkt. Následuje Package – popisuje MSI balíček, který bude vytvořen. Tag Media definuje kam se zabalí a odkud se následně budou brát zdrojové soubory pro vaši instalaci. Struktura Directory, Component, File definuje adresáře a soubory, které se vytvářejí při samotné instalaci – zde je třeba si pamatovat, že každý adresář je navíc identifikován tagem Component (která má vlastní GUID) a teprve v tomto tagy smí být uvedeny soubory. Zde musím zmínit první trik – pokud potřebuje vytvořit prázdný adresář, pak je nutné do tagu Component vložit následující tag: <CreateFolder />. Posledním tagem je Feature, který udává jaké komponenty (v podstatě adresáře), budou nainstalovány (lze je pak zobrazit a vybírat v dialogu pro výběr instalovaných komponent – tento dialog určitě všichni znáte).

Dialogy a vytvoření MSI

Takovýto instalátor by nám sice fungoval, ale neobsahoval by žádné obrazovky. Proto, abychom zapnuli podporu pro zobrazování obrazovek je nutné někde do tagu Product umístit následující konstrukci: <UIRef Id=“WixUI_Common“ />, kde id může nabývat několika hodnot, které najdete v dokumentaci. Základním rozdílem mezi těmito id je, kolik a jaké obsahují dialogy. Některé jsou bohatší a obsahují úplnou sadu dialogů, některé obsahují jen ty základní. Mnou zmiňovaný Common slouží především k vlastní definici flow dialogů.

Pokud tedy přidáme UIRef můžeme se pustit do procesu vytváření instalačního balíku. To provedeme již zmiňovanými nástroji:

  1. candle.exe -nologo source.wxs -out outobj.wixobj  -ext WixUIExtension (vytvoření wixobj souboru za pomoci UI rozšíření)
  2. light.exe -nologo outobj.wixobj -out final.msi  -ext WixUIExtension (vytvoření MSI balíku, opět s pomocí UI rozšíření)

Nyní bychom měli mít k dispozici MSI balík, který již půjde spustit a bude obsahovat klasický install wizard (pokud jsme zvolili správné UIRef id).

V dalším díle se podíváme na pár triků, které by vám mohli pomoci při vytváření vlastních instalátorů. Těšíme se na vaše komentáře.