Podmínky (Conditions)
Instalaci rozšíříme o podmínku na kontrolu verze operačního systému a také o podmínku, že je již při spouštění instalace MSI souboru nainstalován .NET Framework ve verzi 4.0.
<!--Check for OS Version-->
<Condition Message="!(loc.WindowsVersionRequired)">
<![CDATA[VersionNT >= 501]]>
</Condition>
<!--Check for installed .NET Framework Version-->
<PropertyRef Id="NETFRAMEWORK40FULL" />
<!-- NETFRAMEWORK40FULL is set to 1 if the .NET Framework 4.0 full is installed -->
<Condition Message="!(loc.dotNetRequired)">
<![CDATA[Installed OR NETFRAMEWORK40FULL]]>
</Condition>
První podmínka testuje, že verze operačního systému je alespoň 501 tedy Windows XP nebo novější, k tomu využíváme vestavěnou proměnnou VersionNT. Druhou podmínku na kontrolu instalace .NET Frameworku 4.0 v plné verzi provádíme vlastností NETFRAMEWORK40FULL. Aby podmínka fungovala, musíme tuto vlastnost napřed uvést elementem PropertyRef. Vlastnost je definována v knihovně WixNetFxExtension, kterou musíme ještě také přidat do referencí projektu.
Pozn.: Detekce FW 4.0 je takto podporována až od verze WiX 3.5, jinak se proměnná NETFRAMEWORK40CLIENT (pro client profile) nebo NETFRAMEWORK40FULL (pro plnou verzi) musí zavést ručně:
<!-- set to #1 if the .NET Framework 4.0 client is installed (not set otherwise) -->
<Property Id="NETFRAMEWORK40CLIENT" Secure="yes">
<RegistrySearch Id="NetFramework40Client" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" Name="Install" Type="raw" />
</Property>
<!-- set to #1 if the .NET Framework 4.0 full is installed (not set otherwise) -->
<Property Id="NETFRAMEWORK40FULL" Secure="yes">
<RegistrySearch Id="NetFramework40Full" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Install" Type="raw" />
</Property>
Ještě zbývá do lokalizačních souborů doplnit stringy WindowsVersionRequired a dotNetRequired např. takto:
Strings.cs.wxl:
<String Id="WindowsVersionRequired" Overridable="yes">Tato aplikace je podporovaná pouze na Windows XP nebo vyšší.</String>
<String Id="dotNetRequired" Overridable="yes">[ProductName] vyžaduje, aby byl nainstalován Microsoft .NET Framework 4 Full.</String>
Strings.en.wxl:
<String Id="WindowsVersionRequired" Overridable="yes">This application is supported only on Windows XP or higher.</String>
<String Id="dotNetRequired" Overridable="yes">[ProductName] requires the Microsoft .NET Framework 4 Full to be installed.</String>
Více o definování podmínkách můžete najít zde:
http://www.codeproject.com/KB/install/WixWindowsInstallerDemo2.aspx
http://wix.sourceforge.net/manual-wix3/check_for_dotnet.htm
http://wix.sourceforge.net/manual-wix3/block_install_on_os.htm
Merge Modules
Druhá věc, co si v této části ukážeme, bude, jak přidat instalaci Merge Modulu do našeho MSI souboru. Merge module, je soubor msm, který obsahuje instalaci nějaké komponenty, ale na rozdíl od MSI souboru nelze rovnou instalovat, ale je ho možné přidat do jiného msi souboru. My do naší instalace přidáme merge modul pro instalaci VC++ runtime.
Přidání provedeme elementem Merge, který se umístí do elementu Directory.
<Directory Id="TARGETDIR" Name="SourceDir">
...
<Merge Id="VCRedist" SourceFile="Merge Modules\Microsoft_VC100_CRT_x86.msm" DiskId="1" Language="0"/>
<Merge Id="VCRedistATL" SourceFile="Merge Modules\Microsoft_VC100_ATL_x86.msm" DiskId="1" Language="0"/>
</Directory>
Soubory msm nahrajeme k naší instalaci (do podadresáře Merge Modules) z adresáře c:\Program Files\Common Files\Merge Modules resp. c:\Program Files (x86)\Common Files\Merge Modules, kde jsou po instalaci Visual Studia nahrány.
Ještě musíme přidat odkazy na merge moduly do sekce Feature:
<Feature Id="AlwaysInstall" Title="[ProductName]" Description="Test Application files" TypicalDefault="install" Display="expand" Absent="disallow" Level="1" >
...
<MergeRef Id="VCRedist"/>
<MergeRef Id="VCRedistATL"/>
</Feature>
Odkaz na WiX manuál:
http://wix.sourceforge.net/manual-wix3/install_vcredist.htm
Custom action
Jako příklad Custom akce nastavíme spouštění exe souboru. Akce se spustí během instalace ve fázi po nakopírování aplikačních souborů. V praxi takto můžeme například provést nastavení připojení databáze k instalované aplikaci, pozměnit aplikační config soubor a podobně. Protože počítáme, že náš exe soubor bude sloužit pouze pro provádění akcí během instalace, zahrneme ho přímo jako Binary zdroj instalace, odkud se spustí a nebude se tedy vůbec kopírovat do aplikačního adresáře. V naší ukázkové instalaci exe soubor provede pouze zobrazení cesty, kam je aplikace instalována (hodnota parametru).
Do souboru wxs přidáme následující řádky:
<Binary Id="CustomInstaller" SourceFile="Binary\CustomInstaller.exe" />
<UI>
<ProgressText Action="ExecuteCustomInstaller">!(loc.UIExecuteCustomInstaller)</ProgressText>
</UI>
<CustomAction Id="ExecuteCustomInstaller" BinaryKey="CustomInstaller" ExeCommand='"[APPLICATIONROOTDIRECTORY]"' Execute="deferred" Impersonate="no" Return="check"/>
<InstallExecuteSequence>
<Custom Action="ExecuteCustomInstaller" Before="InstallFinalize">
<![CDATA[not REMOVE]]>
</Custom>
</InstallExecuteSequence>
Element Binary, podobně jako jsme ho již použili na ikony instalace, přidává soubor CustomInstaller.exe mezi soubory instalace. Elementem CustomAction definujeme vlastní akci, v tomto případě jeho spuštění. Jako zdroj akce zde vybíráme BinaryKey (z variant FileKey, BinaryKey, Directory, Property), kde je odkaz na CustomInstaller Binary. Parametr spouštění je určen atributem ExeCommand a zadáním hodnoty check atributu Return určujeme, že se akce spustí a installer počká na její dokončení.
Nadefinovanou custom akci musíme přidat do instalační sekvence, to provádíme sekcí InstallExecuteSequence, kde elementem Custom doplňujeme vyvolání akce, důležité je zde určení, kdy se má akce vyvolat, atributem Before nebo After a jménem akce před kterou / po které se akce spouští. Zde je definována hodnota Before InstallFinalize.
Poslední změnou je přidání textu ProgressText do sekce UI tj. text zobrazen v době, kdy je akce spuštěna. Hodnotu nastavíme opět v lokalizačních souborech:
<String Id="UIExecuteCustomInstaller" Overridable="yes">Spuštění Custom Installeru</String>
<String Id="UIExecuteCustomInstaller" Overridable="yes">Custom Installer execute</String>
Všimněte si výsledku (při spouštění akce je v průběhu zobrazen náš určený text).
A ještě jednou upozorním, že takto nelze jako součást instalace spouštět instalování jiných MSI např. s komponentami, ty musíme nainstalovat samostatně již před vlastní instalací součásti Bootstrapper programu. O tom bude příští poslední část.
Odkazy custom akce ve WiX manuálu:
http://wix.sourceforge.net/manual-wix3/install_directx9.htm
http://wix.sourceforge.net/manual-wix3/run_program_after_install.htm
Další odkazy celkově o WiXu:
http://www.codeproject.com/KB/install/WiXTricks.aspx
http://stackoverflow.com/questions/471424/wix-tricks-and-tips
http://vsadnajavu.cz/2010-03/nezarazene/wix-vytvorte-si-vlastni-instalator-1-dil
http://www.tramontana.co.hu/wix
http://www.scribd.com/doc/52752777/1849513724WiX