Jak dostosować działanie instalatora z Qt Installer Framework

Witajcie w kolejnym wpisie z serii o Qt Installer Framework! W poprzednim poście omówiliśmy krótko czym są skrypty, a także jak je wykorzystać, aby dowolnie dostosowywać wygląd instalatora. Dzisiaj zgłębimy ten temat nieco bardziej: poznacie poszczególne typy skryptów, a także jak je stworzyć w Qt Installer Framework. Nie zabraknie też oczywiście przykładów, na których będziecie mogli się wzorować. No to do dzieła!

Czym jest Scripting API?  

Zanim przejdziemy do tworzenia skryptów, wyjaśnijmy najpierw jak działa i czym jest Scripting API.

Scripting API w Qt Installer Framework to zbiór obiektów JavaScript. Skrypty stworzone przy użyciu tego API korzystają z rozszerzenia plików .qs, które z kolei są wykonywane przez QJSEngine. Dzięki skryptom możesz wykonywać określone akcje lub zmieniać zachowanie instalatora. Takie rozwiązanie jest przydatne, gdy chcemy np. zmienić kolejne strony instalatora zależnie od wybranych przez użytkownika komponentów. Jeżeli chodzi o instalatory, to mamy dwa, główne typy skryptów: skrypty kontrolera i skrypty komponentu.

Dla przypomnienia: skrypty kontrolera służą do interakcji z konkretnymi częściami wyglądu instalatora lub jego funkcjonalnościami. Dzięki nim możesz np. modyfikować istniejące strony albo symulować kliknięcie, w celu automatyzacji procesu instalacji. Instalator może mieć tylko jeden skrypt kontrolera – musi on być wskazany w pliku config.xml.

Z kolei skrypty komponentu kontrolują zachowanie wybranych komponentów instalatora. Warto tu dodać, że paczka instalatora sama w sobie jest komponentem, który może dzielić się na wiele, różnych podkomponentów. Jeżeli nie pamiętacie czym jest paczka, to sprawdźcie nasz pierwszy poradnik z serii o Qt Installer Framework. Oznacza to, że każdy z komponentów może mieć swój własny, odrębny skrypt. Skrypty te są wykonywane, gdy odpowiadający im komponent zostanie wybrany do instalacji. Ścieżka do skryptu powinna znaleźć się w pliku package.xml.

Podstawy skryptu kontrolera  

Zanim przejdziemy dalej, omówmy strukturę skryptów w Qt Installer Framework. Skrypty kontrolera i komponentu mają prawie taką samą strukturę. Jedyne, co je różni, to ich możliwości, a także nazwa konstruktora.

Najprostszy, prawidłowy skrypt składa się jedynie z konstruktora. Na początek stworzymy plik script.qs. Aby plik ten był rozpoznawany jako plik skryptu, musimy umieścić w nim konstruktor:

Dodajmy teraz prostą funkcję, która zmodyfikuje zachowanie instalatora. Powiedzmy, że strona powitalna ma być zawsze pomijana. Najprostszym rozwiązaniem jest symulacja kliknięcia przycisku „Dalej”, w momencie gdy strona powitalna się pojawi. Zmodyfikujemy więc właściwość Controller.prototype.IntroductionPageCallback. Skrypt powinien teraz wyglądać tak:

Wykorzystaliśmy tutaj dwa globalne obiekty, które są dostępne we wszystkich skryptach kontrolera. Pierwszym z nich jest gui, który jest obiektem JavaScript pozwalającym na interakcje z elementami wyglądu instalatora. Obiekt buttons natomiat, jak sama nazwa wskazuje, udziela dostępu do przycisków ulokowanych w instalatorze. Każda strona posiada również swój własny zestaw metod, przycisków i widżetów, do których możemy uzyskać dostęp z poziomu skryptu. Dla przykładu strona wyboru komponentów posiada funkcję selectAll() lub selectComponent(id), które pozwalają skryptowi wybrać odpowiednie komponenty. Nie będziemy jednak opisywać wszystkich dostępnych funkcji, bo zajęłoby nam to dużo czasu. Listę wszelkich dostępnych opcji znajdziecie w dokumentacji.

Aby wykorzystać nasz nowoutworzony skrypt w instalatorze, otwórz jego plik konfiguracyjny, a następnie dodaj poniższy znacznik:

Nie zapomnijcie umieścić pliku script.qs w folderze konfiguracyjnym! Gdy wszystko już jest zrobione, to możemy przejść do generowania instalatora – jeżeli nie pamiętacie jak to się robi, sprawdźcie pierwszy wpis z serii.

Qt Installer Framework – podstawy skryptu komponentu  

Wiecie już jak stworzyć, a także jak dołączyć skrypt kontrolera do instalatora w Qt Installer Framework. Przejdźmy zatem do tworzenia skryptu drugiego typu. Tak jak w przypadku skryptu kontrolera, podstawowym elementem skryptu komponentu jest konstruktor – w tym przypadku nazywa się on Component.  Wykorzystajmy skrypt z poprzedniego wpisu – posłuży nam on jako prosty przykład. Jego zadaniem było dodawanie własnej strony do instalatora, jeżeli określony komponent został wybrany. Skorzystaliśmy tam z funkcji addWizardPage():

Funkcja dodająca nową stronę przyjmuje 3 argumenty:

  • Komponent zawierający zarejestrowaną nazwę widżetu, który chcemy dodać – w naszym wypadku korzystamy z globalnego component, który wskazuje na aktualnie wyświetlany komponent
  • Klasa zarejestrowanego widżetu, który chcemy dodać
  • Indeks strony, przed którą chcemy wstawić naszą własną stronę skryptową – w naszym przypadku umieścimy ją tuż przed stroną potwierdzającą instalację.

Aby skrypt komponentu został wczytany trzeba jeszcze stworzyć plik strony .ui w folderze paczki. Będzie on zawierał informacje na temat wyglądu strony. Plik strony razem ze skryptem należy zarejestrować w pliku package.xml:  

Jeżeli ciekawi Cię jak można dostosować wygląd instalatora, sprawdź poprzedni wpis z serii.

Dodawanie skrótu  

Znacie już podstawy tworzenia skryptów, możemy zatem przejść do nieco bardziej zaawansowanych przykładów. Powiedzmy, że chcemy wydać aplikację na system Windows, której instalator automatycznie tworzy skrót na pulpicie po zakończeniu instalacji. Aby to osiągnąć wykorzystamy skrypt komponentu (każdy komponent może mieć odrębny plik wykonywalny/skrót).

W naszym kolejnym skrypcie wykorzystamy zdarzenie

Qt Installer Framework – instalacja rekursywna  

Może się tak zdarzyć, że pomimo bibliotek i plików, które umieściłeś w folderze paczki, twoja aplikacja będzie wymagać innych, zewnętrznych narzędzi, aby poprawnie działać na urządzeniach końcowych. Najlepszym tego przykładem mogą być zestawy narzędzi Microsoft Visual C++ Redistributable, zawierające środowiska C i C++.  Aplikacje zbudowane przy pomocy MVSC wymagają, aby zestawy te były już wcześniej zainstalowane na naszym komputerze.

Wydawałoby się, że wystarczy tylko przekopiować potrzebne pliki bibliotek do naszego folderu wydania i po sprawie. Niestety, większość programów antywirusowych wykrywa pliki zawierające środowisko uruchomieniowe C/C++ jako potencjalne zagrożenie. Użytkownikowi końcowemu zapewne wyskoczyłby wtedy alert, co wzbudziłoby podejrzenia i niechęć co do naszej aplikacji. Co więc powinniśmy zrobić?

Rozwiązanie jest dosyć proste – wystarczy wykonać rekursywną instalację wszystkich pakietów redystrybucyjnych. Mogłoby się to wydawać trudne, jednak w praktyce całe zadanie opiera się na sprawdzeniu, czy urządzenia posiada zainstalowane środowisko uruchomieniowe VC. Jeżeli tak, to instalator kontynuuje swoją pracę. Jeżeli nie, instalator uruchomi odpowiednie instalacje tychże środowisk.

Pierwszą rzeczą, jaką musimy zrobić, to pobranie instalatora paczek redystrybucyjnych ze strony Microsoft, a następnie należy go umieścić w folderze data paczki instalatora:

qt installer framework folder

Teraz przejdźmy do skryptu. Z racji, iż pracujemy z pojedynczym komponentem, skorzystamy oczywiście ze skryptu komponentu. Stwórzmy najpierw funkcję, która sprawdzi, czy środowisko uruchomieniowe VC musi być zainstalowane:

W funkcji tej najpierw sprawdzamy rejestr systemowy, w poszukiwaniu rekordu świadczącego o obecności środowiska VC. Jeżeli nie znajdziemy takowego rekordu, wyświetlamy okienko informujące użytkownika o dodatkowej instalacji. Po kliknięciu OK zostanie uruchomiony instalator środowiska VC. Korzystamy ze ścieżki TargetPath (ścieżki docelowej instalacji), ponieważ instalator ten po instalacji zostanie umieszczony w tym samym miejscu, co nasza aplikacja.

Jedyne co zostało do zrobienia, to wywołanie naszej nowej funkcji. Skorzystamy w tym celu z systemu sygnałów i slotów, aby wywołać ją tuż po zakończeniu instalacji:

Podsumowanie  

W dzisiejszym wpisie dowiedzieliście się czym jest Scripting API w Qt Installer Framework. Poznaliście również typy skryptów, a także jak można je wykorzystać. Z tą wiedzą możecie teraz dowolnie modyfikować zachowanie, jak i również wygląd instalatora. Miejcie na uwadze, że prezentowane dzisiaj przypadki użycia są jedynie kilkoma z wielu, ale nie martwcie się, w następnych wpisach z tej serii omówimy więcej z nich. Aby ich nie przegapić, koniecznie śledźcie naszą stronę na Facebooku i zapiszcie się do naszego newslettera.

You Might Also Like
Dodaj komentarz

icon