Instalator w pliku msi część 7 – generowanie listy plików do instalacji
W poprzednich częściach o WiX:
- część 1 – wstęp teoretyczny o instalatorach
- część 2 – pierwszy instalator
- część 3 – dodanie interfejsu użytkownika
- część 4 – customizacja interfejsu użytkownika
- część 5 – skróty na pulpicie i w menu start
- część 6 – upgrade
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.
Dawid
8 lip 10 at 09:33
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?