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.