WiX - Jak na instalace, část 5: Conditions, Merge Modules, Custom action

Jan Holan       3. 5. 2011       Architektura       7342 zobrazení

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).

CustomAction

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

 

hodnocení článku

0 bodů / 1 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

RE: WiX - Jak na instalace, část 5: Conditions, Merge Modules, Custom action

Ještě doplním jednu custom akci. Instalace by měla zapsat cílovou cestu do hodnoty InstallLocation v uninstall registech. Je to vyžadováno například pokud testujete aplikaci na Windows 7 certifikaci.

WiX toto bohužel nezapíše automaticky, je nutné volat následující custom akci:

[quote]<CustomAction Id="SaveInstallLocation" Property="ARPINSTALLLOCATION" Value="[APPLICATIONROOTDIRECTORY]"/>

<InstallExecuteSequence>

<Custom Action="SaveInstallLocation" Before="InstallValidate">

<![CDATA[not REMOVE]]>

</Custom>

</InstallExecuteSequence>[/quote]

nahlásit spamnahlásit spam 0 odpovědětodpovědět

RE: WiX - Jak na instalace, část 5: Conditions, Merge Modules, Custom action

Ještě doplnění podmínky pro kontrolu nainstalování instance Microsoft SQL Server 2008 Express:

<Property Id="SQLEXPRESSINSTALLED" >

<RegistrySearch Id="IsSqlExpressServiceInstalled" Root="HKLM" Key="SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL" Name="SQLEXPRESS" Type="raw" Win64="yes" />

</Property>

<Condition Message="!(loc.SQLExpressRequired)">

<![CDATA[Installed OR SQLEXPRESSINSTALLED]]>

</Condition>

<String Id="SQLExpressRequired" Overridable="yes">[ProductName] vyžaduje, aby byl nainstalován Microsoft SQL Server 2008 Express.</String>

Aby byl správně vyhledán klíč v registrech i při instalaci na x64 Windows, je nutné uvést u elementu RegistrySearch attribut Win64="yes". Při buildu pak musíme ignorovat Warning "This 32Bit Package is using 64 bit Locator Type in RegLocator table entry IsSqlExpressServiceInstalled".

A ještě jedno doplnění týkající se Custom akcí v .NETu:

Při vytvoření Managet .NET CustomAkce např. v C#, je při kompilaci vytvořena DLL <jméno Projektu>.CA.dll a v ní jsou již automaticky zahrnuty i ostatní referencované vlastní assembly. Stačí tedy uvést do binnary pouze tuto jednu DLL.

Custom Akci pak nadefinujeme jako volání DllEntry, kde bude uvedeno jméno metody v našší CustomAction assembly (také v ní musí tato metoda obsahovat atribut [CustomAction]).

<Binary Id="ManagedInstallerBinary" SourceFile="VratniceInstaller\bin\Release\ManagedInstaller.CA.dll"/>

<CustomAction Id="ExecuteImmediateAction" BinaryKey="ManagedInstallerBinary" DllEntry="ImmediateAction" Execute="immediate" Return="check"/>

<CustomAction Id="ExecuteDeferredAction" BinaryKey="ManagedInstallerBinary" DllEntry="DeferredAction" Execute="deferred" Impersonate="no" HideTarget="yes" Return="check"/>

<InstallExecuteSequence>

<Custom Action="ExecuteImmediateAction" Before="InstallFinalize">

<![CDATA[not REMOVE]]>

</Custom>

<Custom Action="ExecuteDeferredAction" Before="InstallFinalize">

<![CDATA[not REMOVE]]>

</Custom>

</InstallExecuteSequence>

Příklad definuje dvě Custom akce nazvané ImmediateAction a DeferredAction. Jedna je definována jako immediate Execute, druhá jako deferred. Je nutné si uvědomit rozdíl tohoto jiného spouštění, immediate akce je vykonávána hned, ale protože je to ještě ve fázi, kde se instalace pouze ještě připravuje, nelze zde např. použít Administrátorská práva (s zapnutým UAC), zase ale lze přistupovat kompletně k předanému Session objektu a tady k MSI databázi (např. jiným binary v MSI).

Deferred akce je spouštěna při vykonávání instalace, a pokud je nastaveno Impersonate="no", tak s Admin právy. Nelze v ní ale již přes session přistupovat ke zdrojům instalace a proměným (s vyjímkou speciální CustomActionData kolekce). Více na http://www.tramontana.co.hu/wix/lesson3....

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback