Qt winapi - урок 004

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

Для того, щоб зробити це найбільш красивим чином, необхідно, щоб проект був організований зі структурою subdirs. тобто складався з декількох проектів. Нам же не потрібно при кожній збірці проекту створювати інсталятори. Тому проект інсталятора буде окремим.

Але автоматизацію windeployqt залишимо в основному проекті.

структура проекту

Qt winapi - урок 004
  • Отже, маємо проект, з двома підпроекти:

    1. Hello.pro - проект програми
    2. 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, ресурсні файли, файли перекладів і т.д. Тобто все, що необхідно для складання робочого додатки.
      • ru.evileg.ecolor - а також, наприклад, директорія другого пакету з вмістом, яке схоже по структурі з попереднім варіантів.

    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 - вказує, що необхідно оновити репозиторій за наступним шляхом. Якщо по цьому шляху немає сховища, то буде створено новий.