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