V minulé části jsme dokončili vytvoření MSI souboru TestApplication.msi, který instaluje naší aplikaci. Aplikace (nebo i samotná její instalace) ale může vyžadovat, aby na počítači byli instalované ještě jiné komponenty tzv. Prerequisites, jako je např. Windows Installer, .NET Framework 4.0, komponenta ReportViewer, MS SQL Server apod. Tyto komponenty mají většinou vlastní instalační balíčky (jiné MSI) a ty nelze zahrnout přímo jako součást našeho MSI balíčku. Jejich instalaci budeme spouštět již před instalací vlastní aplikace pomoci programu Bootstrapper, který vytvoříme. Celá instalace se tedy bude skládat ze souboru setup.exe (program Bootstrapper), MSI nebo exe souborů potřebných komponent a MSI naší aplikace.
Existuje více způsobů, jak program Bootstrapper vytvořit, my si ukážeme jeden z těch jednodušších, který je možné navíc vytvořit přímo Visual Studiem, takže zde nebudeme potřebovat jiný nástroj. Kromě Visual Studia je možné použít dotNetInstaller, nebo součástí WiXu se připravuje (zatím v beta verzi) nástroj Burn (viz článek Burn, baby. Burn.).
Ve Visual Studiu na vytvoření Bootstrapper instalátoru k našemu MSI využijeme nástroj ClickOnce deployment feature, jedná se o stejný nástroj, který se používá v instalačních projektech Visual Studio Installer. Je zde ale jeden problém, a to že v našem projektu typu WiX není možné komponenty vybrat v prostředí studia, ale musí se do projektu zadat ručně. (V projektu Visual Studio Installer se komponenty vybírají ve vlastnostech projektu tlačítkem Prerequisites).
Postup editace projektu je následující:
- Otevřený WiX projekt ve Visual Studiu musíme volbou Unload Project uzavřít.
- Na projektu zvolíme volbu Edit <jméno projektu>. Tím se nám soubor projektu zobrazí v XML editoru.
- Do elementu Project doplníme sekci ItemGroup a do ní nadefinujeme komponenty pomoci elementů BootstrapperFile. Příklad pro komponenty .NET Framework 4.0, ReportViewer a Windows Installer 3.1 je následující (Windows Installer v 3.1 je vyžadován pro instalaci .NET Frameworku 4):
<ItemGroup>
<BootstrapperFile Include="Microsoft.Windows.Installer.3.1">
<ProductName>Windows Installer 3.1</ProductName>
</BootstrapperFile>
<BootstrapperFile Include=".NETFramework,Version=v4.0">
<ProductName>Microsoft .NET Framework 4 (x86 and x64)</ProductName>
</BootstrapperFile>
<BootstrapperFile Include="Microsoft.ReportViewer.10.0">
<ProductName>Microsoft ReportViewer 2010</ProductName>
</BootstrapperFile>
</ItemGroup>
- Dále na konec souboru projektu doplníme sekci Target AfterBuild, kde následovně elementem GenerateBootstrapper definujeme, aby se provedlo vlastní vygenerování bootstrapperu.
<Target Name="AfterBuild">
<GenerateBootstrapper ApplicationFile="$(TargetFileName)" ApplicationName="Application" BootstrapperItems="@(BootstrapperFile)"
ComponentsLocation="Relative" CopyComponents="True" OutputPath="$(OutputPath)"
Path="c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\" />
</Target>
Pozn.: Zadaná cesta SDK c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages odpovídá cestě, kam jsou při instalaci Visual Studia 2010 nahrány instalační balíčky komponent.
- Projekt znovu načteme do studia volbou Reload Project.
Po buildu instalace jsou nyní v adresáři debug kromě souboru TestApplication.msi a vygenerovaného Setup.exe dále i adresáře s instalacemi jednotlivých definovaných komponent jako např. \WindowsInstaller3_1\WindowsInstaller-KB893803-v2-x86.exe nebo \DotNetFX40\dotNetFx40_Full_x86_x64.exe.
Program Setup.exe při spuštění nejprve zkontroluje, jestli definované komponenty nejsou již nainstalované, pokud ano, spustí se rovnou MSI instalace naší aplikace. Pokud některá komponenta není nainstalovaná, zobrazí se dialog na potvrzení její instalace a její licence. Poté se postupně spouští instalace chybějících komponent v režimu bez zobrazení UI instalace (Quiet mode), zobrazen je průběh přímo v okně programu Setup.exe.
Jak ale zjistit, jak pro danou komponentu nadefinovat hodnotu elementu BootstrapperFile? V adresáři Packages je v podadresářích u každé komponenty soubor product.xml, v něm je element product s atributem ProductCode. Tato hodnota ProductCode pro každou komponentu odpovídá hodnotě, která patří zadat do atributu Include elementu BootstrapperFile. Dále pak v elementu ProductName je uvedeno jméno komponenty již v podstatě libovolně. Ještě uvedu příklady definice některých komponent:
<BootstrapperFile Include=".NETFramework,Version=v4.0,Profile=Client">
<ProductName>Microsoft .NET Framework 4 Client Profile (x86 and x64)</ProductName>
</BootstrapperFile>
<BootstrapperFile Include="Microsoft.Windows.Installer.4.5">
<ProductName>Windows Installer 4.5</ProductName>
</BootstrapperFile>
<BootstrapperFile Include="Microsoft.Sql.Server.Express.10.0">
<ProductName>SQL Server 2008 Express</ProductName>
</BootstrapperFile>
Pozn.: Pro ulehčení přidávání komponent do projektu se ještě dá použít nástroj Bootstrapper Manifest Generator z doby Visual Studia 2008.
Nevýhoda tohoto způsobu tvorby bootstrapper programu je v tom, že tímto způsobem lze nadefinovat pouze komponenty, které se nacházejí v adresáři Packages tj. pouze ty, které jsou dodávány pro Visual Studio 2010. Pokud proto potřebujete instalovat jinou nebo třeba i vlastní komponentu, použít takto generovaný bootstrapper nedoporučuji. Naopak, pokud potřebujete klasickou instalaci .NET aplikace a k ní např. kombinaci Installer 3.1, .NET Framework 4.0 a ještě třeba ReportViewer, nebo Installer 4.5, .NET Framework 4.0 a MS SQL Server Express, je toto řešení ideální.
Pozn.: Tyto uvedené kombinace komponent mi fungovali naprosto bez problémů (navíc již ani nevyžadují oblíbený restart počítače), ale narazil jsem na problém, pokud je takto do bootstrapperu přidána komponenta Visual C++ 2010 Runtime, ta se mi totiž nespustila v Quiet modu. Pokud potřebujeme instalovat Visual C++ Runtime, doporučuji ho spíše vložit do instalace jako Merge Modul, viz předchozí část.
Touto částí je celý článek o tvorbě instalací pomoci WiX ukončen. A jak jsem slíbil v první části, kompletní příklad naší testovací instalace, kterou jsme vytvořili, je možné stáhnout zde.
Ještě některé odkazy týkající se tvorby bootstrapper programu:
http://wix.sourceforge.net/manual-wix3/install_dotnet.htm
http://www.codeproject.com/KB/install/WixWindowsInstallerDemo4.aspx
http://stackoverflow.com/questions/3017805/how-do-i-make-a-wix-3-5-installer-with-a-completely-self-contained-net-4-0-insta