Qt winapi - урок 004
Правильний програміст - це ледачий програміст. Якщо є можливість щось автоматизувати, то обов'язково потрібно це зробити. Наприклад, можна зробити автоматичне виконання windeployqt зі складанням онлайн і оффлайн інсталяторів, а також підготовкою сховища додатка за допомогою Qt Installer Framework і чорної магії QMake.
Для того, щоб зробити це найбільш красивим чином, необхідно, щоб проект був організований зі структурою subdirs. тобто складався з декількох проектів. Нам же не потрібно при кожній збірці проекту створювати інсталятори. Тому проект інсталятора буде окремим.
Але автоматизацію windeployqt залишимо в основному проекті.
структура проекту

Отже, маємо проект, з двома підпроекти:
- Hello.pro - проект програми
- Installer.pro - проект інсталятора
Основний проект представляє собою самий звичайний "Hello world", але найбільший інтерес полягає в скрипті QMake, який відповідає за windeployqt додатки.
Другий проект має мінімальну структуру для збирання оффлайн і онлайн інсталяторів, а також збірки сховища. Скрипт QMake в профайлі проекту також містить необхідну інформацію для автоматизації збирання інсталяторів.
Автоматизація WinDeployQt
HelloInstaller.pro
Крім звичайного вказівки директорій збірки виконуваного файлу, а також інших вихідних файлів проекту, в даному QMake скрипті виконується запуск утиліти windeployqt.
Якщо із зазначенням збірки папки виконуваного файлу все ясно, то розберемося з тим, що ж відбувається при виконанні windeployqt.
QMAKE_POST_LINK - це директива, яка вказує дії після завершення збирання проекту. Тобто те, що ми виконуємо після того, як був зібраний виконуваний файл.
$$ (QTDIR) - змінна, яка містить шлях до комплекту збірки Qt. У моєму випадку це D: \ Qt \ 5.7 \ mingw53_32.
Для виконання windeployqt не обов'язково вказувати виконуваний файл, досить вказати в якості аргументу папку, де цей файл знаходиться. В результаті, після закінчення складання проекту, буде виконана автоматична збірка необхідних для застосування dll. і вони будуть поміщені поруч з виконуваним файлом.
Збірка інсталяторів і сховища
Збірка інсталяторів і онлайн сховища проекту проводиться за допомогою Qt Installer Framework, який містить у своєму складі утиліти, як для складання самих інсталяторів, так і для підготовки сховища додатки.
Для складання будуть використовуватися дві утиліти з цього фреймворка:
- binarycreator - утиліта для збірки інсталятора;
- repogen - утиліта для підготовки онлайн сховища.
Перш, ніж розбиратися з QMake скриптом, вивчимо конфігураційні файли і структуру директорій для збірки інсталяторів.
структура директорій
Розглянемо структуру проекту:
- config - в якій знаходиться конфігураційний файл інсталятора:
- config.xml - в даному файлі буде міститися інформація про віддаленому репозиторії, версії, назві проекту і т.д.
- packages - в якому будуть знаходитися пакети, з яких будуть збиратися інсталятори, наприклад:
- ru.evileg.helloinstaller - директорія першого пакету
- meta - директорія, яка містить інсталляіонние скрипти, які будуть описувати специфічний функціонал, наприклад, закриття активного екземпляра додатка, якщо проводиться оновлення додатка, або прописування інформації до реєстру системи.
- package.xml - в мінімальному варіанті потрібна наявність даного файлу, який буде описуватися версію і дату складання проекту. Ця інформація буде потрібно для формування файлу Updates.xml, який буде поміщений в онлайн репозиторій.
- data - в дану директорію необхідно буде помістити виконуваний файл і всі необхідні dll, ресурсні файли, файли перекладів і т.д. Тобто все, що необхідно для складання робочого додатки.
- meta - директорія, яка містить інсталляіонние скрипти, які будуть описувати специфічний функціонал, наприклад, закриття активного екземпляра додатка, якщо проводиться оновлення додатка, або прописування інформації до реєстру системи.
- ru.evileg.ecolor - а також, наприклад, директорія другого пакету з вмістом, яке схоже по структурі з попереднім варіантів.
- ru.evileg.helloinstaller - директорія першого пакету
config.xml
package.xml
Тут уже вказується додаткова інформація про порядок встановлення програми в систему, тобто наявність певних форм, вікон, настановних скриптів, наприклад, для занесення інформації до реєстру. Також додано інформацію про дату випуску додатка, що також буде поміщено в файл Updates.xml.
Даний файл повинен міститися в кожному пакеті. Інсталятор може надавати можливість встановлення ряду компонентів, згадайте інсталятор Qt, там багато пунктів. Відповідно кожен такий пакет являє свій пункт.
- DisplayName - найменування компонента. Обов'язковий тег.
- Description - опис компонента. Обов'язковий тег.
- Version - версія компонентаю. Обов'язковий тег.
- ReleaseDate - дата випуску. Обов'язковий тег.
- Default - вибір компонента за замовчуванням, тобто обраний компонент для установки, чи ні.
- Name - ідентифікатор пакета у вигляді доменного імені. Обов'язковий тег.
- ForcedInstallation - вказує, що компонент обов'язковий до установки і користувач не може його виключити з установки
- RequiresAdminRights - вказує, що пакет повинен встановлюватися з правами адміністратора. Поле необов'язкове. І найцікавіше те, що в процесі роботи інсталятор може втратити дані права адміністратора. Тобто для деяких дій знадобиться заново запитувати у користувача права адміністратора.
Installer.pro
Тут представлений варіант із збіркою інсталяторів в окремих папках для Release і Debug версій. А також підготовкою сховища для Release версії.
Для складання оффлайн інсталятора скористаємося утилітою binarycreator з наступними параметрами:
- --offline-only - як видно з назви, вказує, що збираємо оффлайн інсталятор
- -c - вказує шлях до конфігураційного файлу
- -p -зазначає шлях до папки з пакетами, в процесі роботи QtIFW сам розбереться з тим, як сформувати пакети в інсталятор з урахуванням їх конфігураційних файлів і скриптів з папки meta
Примітка. Для онлайн версії інсталятора все те ж саме, тільки аргумент --offline-only замінюється на --online-only.
А для підготовки сховища скористаємося утилітою repogen. з наступними параметрами:
- -p - вказує папку з пакетами
- -i - вказує пакети, які необхідно включити в інсталятор
- -update - вказує, що необхідно оновити репозиторій за наступним шляхом. Якщо по цьому шляху немає сховища, то буде створено новий.