Tämä WiX-template on jaettu erillisiin osiin (Fragment) ja se koostuu kolmesta eri tiedostosta sekä lisäksi paketissa käytetään käyttöliittymäfragmenttia, joka soveltuu käytettäväksi minkä tahansa paketin kanssa.
| Tiedosto | Sisältö |
|---|---|
template.wxs | Paketin perusrunko |
fragment-files.wxs | Fragment, jossa määritelty tiedosto- ja hakemistorakenne |
fragment-registry.wxs | Fragment, jossa määritelty rekisteriasetukset |
| Lisäksi | |
ui-utu.wxs | Fragment, jossa määritelty käyttöliittymä |
| ui-kuvat | UI-fragmentin käyttämät kuvatiedostot |
Alla kommentoituna WiX-paketin perusrunko (template.wxs).
<?xml version='1.0'?>
<Wix xmlns="C:\tools\wix2\doc\wix.xsd">
<!-- Huomioitavaa Product-elementissä:
* Id - joka versiolle ja tuotteelle oma uniikki id
* Name - näkyy asennusikkunoissa ja Add/Remove Programs:issa. Käytä tyyliä: Nimi versio
* Language - käytä 1033
* UpgradeCode - saman tuotteen eri versioilla aina sama upgradecode
-->
<Product Id='[uniikki_guid]'
Name='Foo 1.2'
Language='1033'
Version='1.2.0.0'
Manufacturer='Foo Products'
UpgradeCode='[upgradecode]'>
<!-- Huomioitavaa Package-elementissä:
* Käytettäessä muotoa Id='????... WiX arpoo aina pakettia käännettäessä uuden Package Id:n
* InstallerVersion on Windows Installerin minimiversiovaatimus
* Compressed='yes' pakkaa msi-pakettiin tulevat tiedostot
-->
<Package Id='????????-????-????-????-????????????'
Description='Foo 1.2'
Comments='Foo - University of Turku'
Manufacturer='University of Turku'
InstallerVersion='200'
Compressed='yes' />
<!-- Tiedostot tulevat omaan cab:iinsa, joka taas tulee MSI-paketin sisään -->
<Media Id='1' Cabinet='product.cab' EmbedCab='yes' />
<!-- Ladataan standardi ui-utu käyttöliittymä (muista kopioida tarvittavat tiedostot) -->
<FragmentRef Id="ui-utu" />
<!-- Upgrade-elementti tarpeen myös ensimmäisessä versiossa,
* Id - sama kuin tämän paketin UpgradeCode
-->
<Upgrade Id='[upgradecode]'>
<!-- Etsii vanhat versiot, ei tarpeen ensimmäisessä versiossa.
Minimum pitäisi olla ensimmäisen version numero, maximum pitäisi
olla tämän paketin versionumero -->
<UpgradeVersion OnlyDetect='no' Language='1033' IgnoreRemoveFailure='no'
IncludeMinimum='yes' Minimum='1.0.0' IncludeMaximum='no'
Maximum='1.2.0' Property='OLDFOUND' />
<!-- Estää asentamisen, jos uudempi on jo asennettu, tarpeen
kaikissa versioissa. Minimum pitäisi olla tämän paketin versionumero -->
<UpgradeVersion OnlyDetect='yes' Language='1033' IncludeMinimum='no'
Minimum='1.2.0' Property='NEWFOUND' />
</Upgrade>
<!-- Näyttää käyttöliittymän, ei tarpeellista muuttaa -->
<InstallUISequence>
<FindRelatedProducts Sequence="200" />
<Show Dialog="UI_Obsolete" Sequence="201">NEWFOUND</Show>
<Show Dialog="UI_Updateprompt" Sequence="202">OLDFOUND</Show>
<Show Dialog="UI_Progressbar" Sequence="203" />
</InstallUISequence>
<!-- Poistaa vanhat versiot jos löytyi, ei tarpeellista muuttaa -->
<InstallExecuteSequence>
<RemoveExistingProducts Before='InstallInitialize'>OLDFOUND</RemoveExistingProducts>
</InstallExecuteSequence>
<!-- Määritellään ylimmän tason hakemisto, johon fragment-files.wxs viittaa. Koko muu hakemistorakenne on
määritelty fragment-files.wxs:ssä.
Tässä kuvaukset käytettävistä Property:istä:
TARGETDIR - TARGETDIR must be the name of one root in the Directory
table. It is used as the location to copy the Installer
installation package during an administrative installation.
SOURCEDIR - The SourceDir property is the root directory containing
the source cabinet file or the source file tree of the
installation package. This value is used for directory resolution.
-->
<Directory Id='TARGETDIR'
Name='SourceDir'>
</Directory>
<!-- Feature, jonka tämä paketti asentaa -->
<Feature Id='FooL' Title='Foo' Level='1'>
<!-- Viittaukset komponentteihin, joissa on määritelty
tiedostot ja rekisteriavaimet. Komponentit ovat siis
omissa Fragment-tiedostoissaan)
-->
<ComponentRef Id='component0' />
<ComponentRef Id='component1' />
<ComponentRef Id='component2' />
<ComponentRef Id='regcomponent0' />
</Feature>
<!-- Kuvaketiedosto. Id:n pitää päättyä .exe, koska tiedosto, johon
kuvake osoittaa on päätteeltään .exe (Windows Installerin outouksia)
-->
<Icon Id="foo.exe" src="foo.ico" />
<!-- Hävitetään 'Modify'-nappula Add/Remove programsista, koska tässä
paketissa on vain yksi Feature eikä siten mitään muokattavaa.
Eikä kyllä olisi mitään Modify-käyttöliittymääkään. -->
<Property Id="ARPNOMODIFY">1</Property>
</Product>
</Wix>
Tiedostofragmenttia ei tarvitse tehdä käsin, sitä varten löytyy valmis työkalu, mallow.exe. Pistä ohjelman tarvitsemat tiedostot hakemistorakenteeseen, joka jäljittelee asennuksen rakennetta:
Aja mallow:
mallow.exe -d src -a src -1 -t fragment-files.wxs
Tämän jälkeen sinulla on tiedosto fragment-files.wxs, jota pitää hieman muokata. Tässä miltä sen tulisi näyttää muokkauksen jälkeen:
<?xml version="1.0" encoding="windows-1252"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
<!-- Fragmentin id, eli millä pääpaketti siihen viittaa -->
<Fragment Id="filefragment">
<!-- Mallow referoi oletuksena juurihakemiston pääpaketista, jossa se tulisi määritellä -->
<DirectoryRef Id="TARGETDIR">
<!-- Jos Id on "ProgramFilesFolder" niin WiX ymmärtää asentaa kohdekoneessa %PROGRAMFILES%-hakemistoon -->
<Directory Id="ProgramFilesFolder" LongName="PROGRAMFILES" Name="PROGRA~1">
<Directory Id="INSTALLDIR" Name="Foo">
<!-- Jokaisella komponentilla tulee olla oma uniikki GUID -->
<Component Id="component0" Guid="GUID" DiskId="1">
<!-- File-elementissä tärkeitä:
* Name - 8.3 pituinen nimi
* LongName - pitkä nimi, jos eri kuin Name
* KeyPath - tarkastaako WiX tämän tiedoston läsnäolon käynnistyksen yhteydessä, jos puuttuu
niin koko feature asennetaan uudelleen
* Vital - asennus epäonnistuu, jos tätä ei voida kopioida -->
<File Id="file0" Name="foo.bat" src="src\PROGRAMFILES\Foo\foo.bat" KeyPath="yes" Vital="yes" />
<!-- Shortcut-elementillä määritellään Start-valikkoon pikakuvake, jolla ohjelma voidaan käynnistää
Shortcut laitetaan sen komponentin sisään, joka sisältää ajettavan tiedoston (tässä tapauksessa
foo.bat. Shortcut-elementissä tärkeitä:
* Directory - Hakemisto, jonne laitetaan, hakemistolla viitataan Start-valikkoon
* LongName - Nimi joka näkyy Start-valikossa
* Target - Featuren Id, johon kuvake viittaa
* Icon - Ikonin Id, jota käytetään kuvakkeena
* Description - Teksti, joka näkyy ToolTippinä, jos hiirtä pitää kuvakkeen päällä
-->
<Shortcut Id="fooshortcut" Directory="ProgramMenuFoo" Name="Foo" LongName="Foo" Target="FooL"
WorkingDirectory="INSTALLDIR" Icon="foo.exe" Description="Foo - bar" />
</Component>
<Component Id="component1" Guid="GUID" DiskId="1">
<!-- Tälle ei pistetä KeyPath arvoa koska käyttäjä saa vapaasti poistaa tämän tiedoston -->
<File Id="file1" Name="readme.txt" src="src\PROGRAMFILES\Foo\readme.txt" />
</Component>
</Directory>
</Directory>
<Directory Id="SystemFolder" LongName="SYSTEMFOLDER" Name="SYSTEM~1">
<Component Id="component2" Guid="GUID" DiskId="1">
<File Id="file2" Name="foo.ini" src="src\SYSTEMFOLDER\foo.ini" KeyPath="yes" Vital="yes" />
</Component>
</Directory>
<!-- Luodaan hakemistopolku Start-valikkoon, johon shortcut (yllä) viittaa
* Id - WiX tunnistaa id:n ProgramMenuFolder ja viittaa sillä Start-valikkoon
-->
<Directory Id="ProgramMenuFolder" Name="PMenu" LongName="Programs">
<Directory Id="ProgramMenuFoo" Name="Foo" LongName="Foo" />
</Directory>
</DirectoryRef>
</Fragment>
</Wix>
Directory-elementin Id-attribuutissa on joukko avainsanoja, kuten esim. yllä käytetty ProgramFilesFolder, joilla voidaan viitata yleisiin Windows kansioihin. Lista niistä löytyy MSDN:stä.
MSI-paketti luodaan tiedostoista seuraavasti
Ensin .wxs-tiedostot käännetään objektitiedostoiksi:
candle.exe -nologo template.wxs fragment-files.wxs fragment-registry.wxs ui-utu.wxs
Sitten objektitiedostot linkitetään MSI-paketiksi:
light.exe -nologo -out Foo-1.2.msi template.wixobj fragment-files.wixobj fragment-registry.wixobj ui-utu.wixobj ui-utu.wixobj
Ja pakettihan sitten vielä testataan kunnolla ennen sen ottamista tuotantoon.