Qt Installer Framework: полное руководство по созданию установщиков

Команда binarycreator -c config/config.xml -p packages MyInstaller.exe завершается ошибкой вида «Cannot find package» почти всегда из-за неверной структуры каталога packages — имя подпапки обязано совпадать с идентификатором пакета в package.xml, и это первое, что стоит проверить при сборке инсталлятора через Qt Installer Framework. Дальше обычно всплывают проблемы с путями в config.xml и отсутствующими файлами данных в папке data.

Qt Installer Framework (сокращённо QtIFW) — официальный инструментарий от Qt для создания кроссплатформенных установщиков: офлайн-инсталляторов, онлайн-установщиков с загрузкой пакетов из репозитория и менеджеров обновлений. Он подходит не только для приложений на Qt — упаковать можно любое ПО, включая программы на C++, Python или .NET. В этой статье разберём установку инструмента, структуру проекта, сборку установщика и типичные ошибки.

Что такое Qt Installer Framework и когда он нужен

Qt Installer Framework — это набор утилит и библиотек, позволяющий собрать установщик с мастером выбора компонентов, лицензионным соглашением, созданием ярлыков и встроенным деинсталлятором. Фреймворк работает на Windows, Linux и macOS, а сам установщик пишет логи и поддерживает тихую установку через параметры командной строки.

Инструмент особенно удобен, когда продукт состоит из нескольких модулей: пользователь может отметить галочками нужные компоненты, а позже через тот же инсталлятор обновить или удалить отдельные части. Именно так устроен официальный установщик самой Qt — он построен на этом же фреймворке.

  • 📦 Офлайн-установщик — один исполняемый файл со всеми данными внутри.
  • 🌐 Онлайн-установщик — маленький лаунчер, скачивающий пакеты из репозитория.
  • 🔧 Репозиторий обновлений — серверная папка, откуда клиенты получают новые версии.
  • 🧩 Скриптовая логика — операции на JavaScript-подобном языке внутри пакетов.

Установка Qt Installer Framework

Самый простой способ получить QtIFW — скачать готовый установщик фреймворка с официального сайта Qt в разделе загрузок. Доступны сборки для Windows, Linux и macOS; после установки в каталоге появятся утилиты binarycreator, repogen, archivegen и installerbase, а также папка examples с образцами проектов.

Альтернативный путь — собрать фреймворк из исходников через qmake или cmake, но для большинства задач это избыточно: официальная сборка закрывает стандартные сценарии. Вам понадобится только добавить путь к bin в переменную окружения PATH, чтобы вызывать утилиты из любой папки проекта.

⚠️ Внимание: версия QtIFW и версия Qt, на которой собран фреймворк, не обязаны совпадать с версией Qt вашего приложения. Установщик — отдельный инструмент, он не линкуется с вашей программой.

Структура проекта установщика

Проект инсталлятора состоит из двух обязательных частей: папки config с файлом config.xml и папки packages с описанием компонентов. Каждый компонент — это подпапка внутри packages, содержащая meta/package.xml и каталог data с файлами, которые попадут на машину пользователя.

Файл config.xml задаёт глобальные параметры: имя продукта, версию, издателя, иконку, заголовок окна и целевой каталог по умолчанию через переменную @TargetDir@. Вот минимальный пример:

<Installer>

<Name>My Application</Name>

<Version>1.0.0</Version>

<Title>My Application Installer</Title>

<Publisher>My Company</Publisher>

<StartMenuDir>My Application</StartMenuDir>

<TargetDir>@ApplicationsDir@/MyApp</TargetDir>

</Installer>

Внутри packages/com.vendor.app/meta/package.xml описывается сам компонент: отображаемое имя, версия, дата релиза, зависимости и скрипт установки. Имя подпапки — это и есть идентификатор пакета, принято использовать обратную доменную нотацию вида com.vendor.component.

📊 Для какой задачи вы используете (или планируете) Qt Installer Framework?
Офлайн-установщик для Windows
Онлайн-установщик с репозиторием
Автообновления приложения
Только изучаю инструмент

Сборка установщика: binarycreator и repogen

Для офлайн-инсталлятора используется утилита binarycreator. Базовая команда выглядит так:

binarycreator -c config/config.xml -p packages MyAppInstaller.exe

Флаг --offline-only явно запрещает сетевые операции, а --online-only создаёт лёгкий установщик, который тянет пакеты из репозитория. Для онлайн-режима сначала нужно сгенерировать репозиторий утилитой repogen:

repogen -p packages repository

Полученную папку repository выкладывают на HTTP-сервер, а её URL прописывают в config.xml в секции <RemoteRepositories>. Тогда установщик при запуске проверит наличие новых версий и предложит обновление.

☑️ Проверка перед сборкой установщика

Выполнено: 0 / 5

Скрипты установки и операции с файлами

Логика сверх простого копирования файлов реализуется через installscript.qs в папке meta пакета. Скрипт позволяет создавать ярлыки, прописывать переменные окружения, запускать внешние программы и задавать вопросы пользователю через дополнительные страницы мастера.

Типичный пример — создание ярлыка на рабочем столе через операцию createShortcut:

component.addOperation("CreateShortcut",

"@TargetDir@/MyApp.exe",

"@DesktopDir@/MyApp.lnk");

Переменные вида @TargetDir@, @HomeDir@, @ApplicationsDir@ подставляются фреймворком автоматически и различаются в зависимости от ОС. Учитывайте, что набор доступных операций и поведение скриптов могут отличаться между версиями QtIFW — сверяйтесь с документацией именно вашей версии.

Как добавить лицензионное соглашение

В package.xml добавьте секцию <Licenses> с элементом <License>, где укажите имя и путь к текстовому файлу лицензии. Файл положите в папку meta пакета. Мастер установки автоматически покажет страницу принятия соглашения.

Типичные ошибки и их решения

Больше всего вопросов вызывают ошибки на этапе сборки и при запуске готового инсталлятора. Ниже — таблица частых проблем.

ОшибкаВероятная причинаРешение
Cannot find packageИмя папки не совпадает с идентификатором пакетаПереименовать папку в точное имя из package.xml
Ошибка парсинга config.xmlНезакрытый тег или недопустимый символПроверить XML валидатором, экранировать спецсимволы
Пустой установщикПапка data компонента пуста или файлы не заархивированыПроверить содержимое data, при необходимости использовать archivegen
Онлайн-установщик не видит обновленияРепозиторий не пересобран или неверный URLЗапустить repogen заново, проверить Updates.xml на сервере
Ярлык не создаётсяОшибка в путях операции CreateShortcutПроверить переменные @TargetDir@ и права на запись

⚠️ Внимание: дата релиза в package.xml влияет на механизм обновлений. Если дата новой версии не новее предыдущей, менеджер пакетов может не предложить обновление пользователям.

Отдельная категория проблем — антивирусные ложные срабатывания на неподписанные установщики под Windows. Цифровая подпись исполняемого файла установщика сертификатом code signing существенно снижает количество блокировок и предупреждений SmartScreen. Подписывать нужно итоговый файл после сборки через binarycreator.

Сравнение с альтернативами

QtIFW — не единственный способ упаковать приложение. Выбор зависит от платформы, требований к обновлениям и привычного стека.

  • 🛠️ Inno Setup — популярный бесплатный инсталлятор только для Windows, гибкий скриптовый язык, но без встроенного механизма онлайн-обновлений.
  • 📜 NSIS — компактные установщики для Windows, требует написания скриптов на собственном языке.
  • 🐧 Пакеты DEB/RPM и AppImage — нативные форматы для Linux, но они не дают единого кроссплатформенного решения.
  • 🔄 Squirrel, Sparkle — специализированные фреймворки автообновлений для Windows и macOS соответственно.

Сильная сторона QtIFW — связка «установщик + менеджер обновлений + репозиторий» в одном инструменте и одинаковое поведение на трёх ОС. Слабая — относительно большой размер самого установщика и необходимость разбираться в XML-конфигурации.

FAQ: частые вопросы о Qt Installer Framework

Можно ли использовать QtIFW для приложения, написанного не на Qt?

Да. Фреймворк упаковывает произвольные файлы: исполняемые файлы, библиотеки, ресурсы любого приложения. Привязки к Qt у вашего продукта нет — Qt используется только самим установщиком.

Как сделать тихую (unattended) установку?

Установщики на QtIFW поддерживают запуск с параметрами командной строки, позволяющими выполнить установку без интерактивного взаимодействия. Точный набор ключей зависит от версии фреймворка — проверьте раздел документации про командную строку для вашей версии.

Как обновить уже установленное приложение?

Используйте онлайн-режим: соберите новую версию пакета с увеличенным номером версии и свежей датой релиза, пересоздайте репозиторий через repogen и выложите его на сервер. Установленный у пользователя менеджер пакетов (MaintenanceTool) обнаружит обновление при запуске.

Поддерживает ли QtIFW цифровую подпись установщика?

Сам фреймворк не подписывает файлы — это делается внешними инструментами, например signtool на Windows или codesign на macOS. Подписывать нужно итоговый исполняемый файл после сборки binarycreator.

Где взять примеры проектов для изучения?

В каталоге установки QtIFW есть папка examples с готовыми демонстрационными проектами: от простейшего офлайн-установщика до примеров со скриптами и кастомными страницами мастера. Начинать изучение удобнее всего с них, копируя структуру в свой проект.