Instalator w pliku msi część 7 – generowanie listy plików do instalacji

W poprzednich częściach o WiX:

Jakiś czas temu Szymon Kobalczyk i Marcin Książek pytali o możliwość automatycznego tworzenia skryptów WxS w oparciu o stworzone przez projekt. Taki mechanizm byłby szczególnie przydatny dla projektów, w których często zmieniają się pliki, które muszą być zainstalowane np: dla aplikacji webowych. Gdy zajrzałem do jednego ze starych projektów stwierdziłem, że używałem do tego dosyć rozbudowanego skryptu Wsh.

W wix3 istnieje całkiem przydatny program narzędziowy, który pozwala właśnie na stworzenie pliku wxs. Aplikacja nazwya się heat. Przy wywoływaniu heat-a ważny jest tzw. harvester, czy zbieracz plików. Przykładowymi harvesterami jest directory, który zbiera wszystkie pliki z folderu oraz project, który tworzy wxs na podstawie wyniku projektu z VS.

Przykładowe wywołanie może wyglądać tak:

heat.exe project myproj.csproj -sfrag -srd -gg -suid -pog:Binaries -pog:Content -out Files.wxs

Omówie po kolei wszystkie parametry:

  • project ? określa typ harvestera, następna jest nazwa pliku projektu
  • sfrag ? powoduje, że nie są generowane osobne fragmenty dla każdego pliku
  • gg ? generuje odrazu guidy dla componentów
  • suid ? powoduje, że pola Id dla komponentów i plików nie są unikalnymi guidami, co jest całkiem przydatne w sytuacji gdy chcielibyśmy w innym miejscu odwołać się do plików
  • pog:Binaries ? określa, które grupy wyjścia mają być uwzględnione w pliku, w przykładzie wybrałem Binaria, parametr pog można powtarzać
  • out Files.wxs ? plik, do którego będzie generowanie wyjście

Plik Files.wxs będzie miał taką postać:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="c2csi.Binaries">
            <Component Id="c2csi.Binaries.c2csi.exe" Guid="{0CCD4E1F-0AD8-40F3-B741-7A11E3E70D99}">
                <File Id="c2csi.Binaries.c2csi.exe" Source="$(var.c2csi.TargetDir)\c2csi.exe" />
            </Component>
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="c2csi.Binaries">
            <ComponentRef Id="c2csi.Binaries.c2csi.exe" />
        </ComponentGroup>
    </Fragment>
    <Fragment>
        <DirectoryRef Id="c2csi.Content">
            <Component Id="c2csi.Content.XMLFile1.xml" Guid="{41E641F5-C0CA-470B-A7F2-73EF37B49A5F}">
                <File Id="c2csi.Content.XMLFile1.xml" Source="$(var.c2csi.ProjectDir)\XMLFile1.xml" />
            </Component>
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="c2csi.Content">
            <ComponentRef Id="c2csi.Content.XMLFile1.xml" />
        </ComponentGroup>
    </Fragment>
</Wix>

Dodatkowo do tego główny skrypt:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="00225fb3-42b1-4404-a595-f9a1c9ad5d16" Name="WixProject2" Language="1045" Version="1.0.0.0" Manufacturer="WixProject2" UpgradeCode="4dd7c3bd-1d88-4d2b-8da9-fd39b11b2653" Codepage="1250">
        <Package InstallerVersion="200" Compressed="yes" />

        <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="c2csi.Binaries" Name="WixProject2">
                </Directory>
            </Directory>
        </Directory>

        <Feature Id="ProductFeature" Title="WixProject2" Level="1">
      <ComponentGroupRef Id="c2csi.Binaries"/>
        </Feature>
    </Product>
</Wix>

Trzymanie plików w osobnym skrypcie WxS jest dobrą praktyką, natomiast z automatycznym generowaniem należy być ostrożnym może to spowodować nieprzewidziane problemy.

Uruchamianie heat warto wrzucić do before build action do projektu wix.

Tagged ,

One thought on “Instalator w pliku msi część 7 – generowanie listy plików do instalacji

  1. Dawid says:

    Bardzo podoba mi się seria Twoich artykułów na temat WiX. Będę chciał go wykorzystać w mojej aplikacji. Brakuje mi tylko jednej rzeczy do pełni szczęścia.
    Podczas instalacji wybór serwera i nazwy bazy danych z listy combo. Następnie aby wybrane parametry zostały wykorzystane podczas uruchamiania programu. Korzystam z pliku konfiguracyjnego, więc sprowadza się to pewnie do przepisania jakoś tych wartości wybranych przez użytkownika. Czy posiadasz jakieś informacje na ten temat?

Leave a Reply

Your email address will not be published. Required fields are marked *