Sisällysluettelo

WiX Template

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

Perusrunko ''template.wxs''

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>

Tiedostot ja hakemistot ''fragment-files.wxs''

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

Rekisteriasetukset ''fragment-registry.wxs''

MSI-paketti

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.