Artykuł

flickr.com/photos/dbreg2007/4376127476 flickr.com/photos/dbreg2007/4376127476
gru 15 2013
0

WiX Toolset - tworzymy własny instalator - cz. 2

W pierwszej części tutoriala, która ukazała się dokładnie miesiąc temu, powiedziałem Wam w skrócie o tym jak za pomocą WiX Toolseta stworzyć własny instalator. Tak jak wspominałem we wcześniejszym tekście, cały pakiet ma olbrzymie możliwości, co oczywiście wiąże się ze sporym stopniem skomplikowania tego rozwiązania.

W dzisiejszym odcinku będziemy kontynuować nasze zmagania z WiXem. Naszym zadaniem będzie przede wszystkim aktywowanie interfejsu GUI. Powiem Wam również o tym jak tworzyć dodatkowe komponenty oraz w jaki sposób definiować różne rodzaje instalacji. Po zakończeniu tej części otrzymacie w pełni funkcjonalny instalator, który nie powinien zbytnio odstawać od tego, co widzicie na co dzień w innych aplikacjach.

WiX Toolset - linia 3.8

Gdy pisałem pierwszą część tekstu, to początkowo wykorzystałem nowszą wersję WiX Toolsetu, czyli linię 4.x. Niestety w praktyce okazało się, że nie jest ona do końca stabilna. Nowsze instalatory pakietu, który można było pobrać ze strony producenta w ostatnich tygodniach, przynajmniej u mnie wysypują się błędem. Jeśli dodać do tego niekompletną dokumentację, czy raczej właściwie jej brak, to trudno będzie znaleźć konkretne przesłanki, które skłoniłyby by użytkowników by dać szansę właśnie tej wersji produktu. Wszystko to skłoniło mnie do sięgnięcia po wersję 3.8, która w między czasie uzyskała status stabilnej. Dokonałem oczywiście aktualizacji poprzedniego wpisu oraz projektu z działu download.

Dlaczego warto postawić na rozbudowane GUI?

W pierwszej części tekstu, stworzyliśmy instalator, który wszystko robi za nas. Oczywiście nie muszę mówić, że nie jest to zbyt szczęśliwe rozwiązanie, a powodów ku takiemu stwierdzeniu, znajdziemy całkiem sporo:

  • Użytkownik nie ma możliwości wyboru lokalizacji aplikacji - domyślna lokalizacja w katalogu Program Files nie zawsze dla wszystkich jest dobrym wyjściem
  • Użytkownik nie ma możliwości wyboru tego co dokładnie chce zainstalować. Wybor instalowanych komponentów jest szczególnie ważny w przypadku dużych produktów. Komponenty są również bardzo przydatne w przypadku gdy aplikacja jest wielojęzyczna
  • Brak jakiejkolwiek interakcji z użytkownikiem - praktycznie nie ma szans zatrzymać procesu instalacji

Użytkownicy naszej aplikacji z pewnością oczekują i zasługują na więcej, dlatego też dokonamy pewnych modyfikacji całego skryptu instalacyjnego.

Przygotowania do aktywacji GUI

W pierwszym kroku, przeniesiemy istniejące we wcześniejszej wersji projektu instalatora pliki do folderu files, który utworzymy w naszym projekcie. Dodamy tam również nowe pliki - wszystko pobierzecie oczywiście z działu download.

Struktura katalogu files wygląda dokładnie tak jak na screenie:

Dodatkowo w katalogu pl-PL umieszczony został plik Multime.resources.dll w którym znajdują się polskie zasoby wykorzystywane w aplikacji (w tym przypadku głównie stringi).

W związku z tym, że liczba plików znacząco zmieniła się w stosunku do tego z czym mieliśmy do czynienia w części pierwszej, musimy również dokonać modyfikacji wewnątrz węzła Directory o ID INSTALLDIR. Dodamy tutaj nowe pliki oraz specjalny komponent, który odpowiedzialny będzie za język polski. Tak jak wspomniałem wcześniej, umieszczanie plików zasobów w osobnych komponentach jest dobrym posunięciem, ponieważ dzięki temu użytkownicy mogą instalować tylko ten język (języki), który ich konkretnie interesuje. Spójrzmy na zmodyfikowany węzeł Directory:

<Directory Id="INSTALLDIR" Name="Multime">
	<Directory Id="PolishLangDir" Name="pl-PL">
		<Component Id="PolishLang" Guid="8B2E45D9-B497-4742-A12F-C4EEA84D2090">
			<File Id="PolishLangDLL" Name="Multime.resources.dll" Source="files/pl-PL/Multime.resources.dll" />
		</Component>
	</Directory>
	<Component Id="MainExecutable" Guid="B35DD4D4-2918-4A65-BA4E-7C8B420C5BC9">
		<File Id="MultimeEXE" Name="Multime.exe" Source="files/Multime.exe" KeyPath="yes">
			<Shortcut Id="StarMenuMultime" Directory="ProgramMenuDir" Name="Multime" 
				WorkingDirectory="INSTALLDIR" Icon="MultimeIco.exe" IconIndex="0" Advertise="yes" />
			<Shortcut Id="DesktopMultime" Directory="DesktopFolder" Name="Multime" 
				WorkingDirectory="INSTALLDIR" Icon="MultimeIco.exe" IconIndex="0" Advertise="yes" />
		</File>
		<File Name="JPLibrary.dll" Source="files/JPLibrary.dll" />
		<File Name="JPWpfCustomControls.dll" Source="files/JPWpfCustomControls.dll" />
		<File Name="Multime.exe.config" Source="files/Multime.exe.config" />
		<File Name="NLog.config" Source="files/NLog.config" />
		<File Name="NLog.dll" Source="files/NLog.dll" />
		<File Name="WPFToolkit.Extended.dll" Source="files/WPFToolkit.Extended.dll" />
	</Component>
</Directory>

Pierwszą nowością jest w tym przypadku nowy zagnieżdżony katalog pl-PL, w którym znajduje się komponent zawierający plik zasobów dla języka polskiego. W dalszej części widzimy komponent znany z pierwszej części tekstu. Oprócz głównego pliku wykonywalnego, znajdują się tutaj wszelkie elementy niezbędne do prawidłowego uruchomienia aplikacji. Warto zwrócić również uwagę na zmianę ścieżek w atrybucie Source. Należy w tym przypadku uwzględnić katalog files, który dodaliśmy w tej części.

Kolejna ważna zmiana czeka nas w węźle Feature, który w przypadku wykorzystania GUI należy rozbudować o nowe atrybuty i elementy. Spójrzcie na poniższy listing:

<Feature Id="Complete" Level="1" Title="Multime" Description="Kompletna paczka." 
	Display="expand" ConfigurableDirectory="INSTALLDIR">
	<Feature Id="MainProgram" Title="Aplikacja" 
		Description="Niezbędne pliki do prawidłowej pracy aplikacji." Level="1">
		<ComponentRef Id="MainExecutable" />
		<ComponentRef Id="ProgramMenuDir" />
	</Feature>
	<Feature Id="Languages" Title="Pakięty językowe" Description="Dodatkowe pakiety językowe." Level="1">
		<Feature Id="LanguagePolish" Title="Język polski" Description="Język polski." Level="1">
			<ComponentRef Id="PolishLang" />
		</Feature>
	</Feature>
</Feature>

Pojawiło się tu sporo nowych elementów. Prześledźmy krok po kroku najważniejsze zmiany:

  • Wielokrotne zagnieżdżanie węzłów Feature pozwala na tworzenie drzewiastej struktury elementów, w przypadku gdy korzystamy z instalacji niestandardowej. W każdym węźle Feature możemy umieszczać kolejne takie same węzły oraz komponenty. Pod tym względem mamy tutaj sporą dowolność. O tym, że to wszystko działa naprawdę, możecie się przekonać patrząc na poniższy screen. Porównajcie sobie to z naszą XMLową strukturą. Wydaje się to być bardzo logiczne - prawda;-)?
  • Atrybuty węzła Feature:
    • Level - określa w jakim przypadku element ma być zainstalowany. Domyślnie 0 oznacza że element ma być w ogólne niedostępny w instalatorze, 1 - element ma być instalowany w typowej instalacji, natomiast wartości większe niż 1 - element ma być instalowany w instalacji pełnej. W naszym przypadku można podwyższyć poziom Level np. dla węzła języków, czy dla samego języka polskiego, ponieważ te elementy nie są wymagane do poprawnej pracy aplikacji. Oczywiście zważywszy na to że w Polsce używamy języka polskiego, to warto te elementy zostawić na domyślnym poziomie
    • Title - nazwa elementu w drzewku instalatora
    • Description - opis elementu w oknie pomocniczym instalatora
    • Display - atrybut mówi o tym, czy drzewko poniżej danego elementu Feature ma być rozwinięte, czy też nie (wartość expand = rozwinięte)
    • ConfigurableDirectory - określa domyślny katalog instalacji - w naszym przypadku wskazujemy wartość z poznanej wcześniej stałej INSTALLDIR

Aktywacja GUI

Aktywacja interfejsu GUI, w tym momencie sprowadza się do dodania dwóch krótkich węzłów do sekcji Product naszego XMLa:

<UIRef Id="WixUI_Mondo" />
<UIRef Id="WixUI_ErrorProgressText" />

Najważniejszy jest tak naprawdę tylko ten pierwszy, który określa jaki zestaw okienek ma się pojawić na naszym instalatorze. My wybraliśmy WixUI_Mondo, który pozwala na dostarczenie kompletnego instalatora, w którym możemy wybrać to co chcemy zainstalować, zatwierdzić licencję aplikacji itp. W przypadku gdy szukacie czegoś mniej wyrafinowanego, lub po prostu Wasza aplikacja jest prosta/mała i nie potrzeba dostarczać użytkownikowi jakiś wielkich opcji wyboru, warto rozważyć pozostałe dostępne opcje. Krótkie porównanie różnych wariantów, znajdziecie tutaj.

Oprócz zmian w pliku Wxs, musimy jeszcze przekazać dodatkowy parametr do linkera (light). Chodzi oczywiście o podpięcie biblioteki zawierającej rozszerzenia GUI:

-ext WixUIExtension

Wszelkie wprowadzone nowości znajdziecie oczywiście w gotowym pliku projektu do pobrania z działu download.

Oczywiście wszystko to co powyżej napisałem to tylko kropla w morzu możliwości jakie dostarczają nam twórcy WiX Toolsetu. Cały interfejs instalatora można dostosować do własnych potrzeb, tworząc nowe ekrany oraz modyfikując te istniejące. Można zmienić kolory, teksty, czy choćby tekst licencji wyświetlanej na jednym z ekranów.

Data ostatniej modyfikacji: 11.02.2014, 11:12.

Podoba Ci się ten wpis? Powiedz o tym innym!

Send to Kindle

Komentarze

blog comments powered by Disqus