DevOps

Обзор Qt Installer Framework (QtIFW) и его возможностей

Введение

Qt Installer Framework (QtIFW) — отдельный инструмент от Qt Company (не входящий в сам Qt SDK, но тесно с ним связанный историей и стилем) для создания кросс-платформенных установщиков приложений: единый набор инструментов и скриптов позволяет генерировать установщики для Windows, macOS и Linux из общего описания, без необходимости поддерживать три полностью разных нативных решения (MSI, DMG, deb/rpm). В статье разберём, что входит в QtIFW и когда он предпочтительнее платформо-специфичных альтернатив.

Концепция

QtIFW состоит из нескольких ключевых инструментов: binarycreator (собирает итоговый установщик из описания и пакетов данных), repogen (генерирует онлайн-репозиторий для последующего сетевого обновления), installerbase (общий runtime-движок, на основе которого работает любой собранный установщик), и archivegen (упаковка пакетов данных). Установщик описывается через XML-конфигурацию (config.xml) и набор «компонентов» — логических единиц устанавливаемого содержимого, каждая со своими метаданными, зависимостями и скриптами установки на JavaScript (через встроенный движок Qt Script/QJSEngine).

Пример кода: Обзор Qt Installer

installer_project/
├── config/
│   └── config.xml              # общая конфигурация установщика
├── packages/
│   └── com.mycompany.myapp/
│       ├── meta/
│       │   ├── package.xml     # метаданные конкретного компонента
│       │   └── installscript.qs # JS-скрипт для кастомной логики установки
│       └── data/
│           └── MyApp.exe        # реальные файлы, которые будут установлены
<!-- config/config.xml — общие настройки установщика -->
<?xml version="1.0" encoding="UTF-8"?>
<Installer>
    <Name>MyApp</Name>
    <Version>1.0.0</Version>
    <Title>Установка MyApp</Title>
    <Publisher>ООО МойКомпани</Publisher>
    <StartMenuDir>MyApp</StartMenuDir>
    <TargetDir>@HomeDir@/MyApp</TargetDir>
    <MaintenanceToolName>MyAppUpdater</MaintenanceToolName>
</Installer>
<!-- packages/com.mycompany.myapp/meta/package.xml — метаданные компонента -->
<?xml version="1.0" encoding="UTF-8"?>
<Package>
    <DisplayName>MyApp — основное приложение</DisplayName>
    <Description>Базовая функциональность приложения MyApp</Description>
    <Version>1.0.0</Version>
    <ReleaseDate>2026-06-23</ReleaseDate>
    <Default>true</Default>
    <Script>installscript.qs</Script>
</Package>
# Сборка итогового установщика из описанного проекта
binarycreator --offline-only -c config/config.xml -p packages MyAppInstaller

Пояснения к коду

Структура проекта QtIFW строго конвенциональна: каждый «компонент» (минимальная устанавливаемая единица, которую пользователь может выбрать или отключить в интерфейсе установщика) представлен директорией с именем, совпадающим с его уникальным идентификатором (com.mycompany.myapp), внутри которой meta/package.xml описывает метаданные, а data/ содержит реальные файлы для копирования на машину пользователя при установке этого компонента.

config.xml задаёт общие, не зависящие от конкретного компонента настройки — имя приложения в заголовках окон установщика, путь установки по умолчанию (@HomeDir@ — встроенная переменная, разрешаемая в домашнюю директорию пользователя на этапе установки), и имя инструмента обслуживания (MaintenanceToolName), который будет установлен вместе с приложением для последующего удаления/обновления (разбираемого в статье 213). Команда binarycreator --offline-only собирает полностью самодостаточный установщик, включающий все файлы пакетов непосредственно в сам исполняемый файл установщика — альтернатива (online-установщик, ссылающийся на отдельно размещённый репозиторий) рассматривается в последующих статьях цикла.

Подводные камни

  • QtIFW распространяется под отдельной, отличной от основного Qt SDK лицензией (исторически — под несколько иными условиями использования) — перед использованием в коммерческом продукте стоит явно проверить актуальные условия лицензирования конкретной версии инструмента, поскольку они могут отличаться от условий, под которыми распространяется сам Qt framework.
  • Отсутствие предварительной проверки целостности структуры проекта установщика перед сборкой. Если, например, ID директории компонента не совпадает с ID, ожидаемым где-то в config.xml или в скриптах зависимостей других компонентов, binarycreator может либо выдать неясную ошибку, либо собрать установщик с тихо пропущенным компонентом — структуру стоит проверять внимательно, особенно при добавлении новых компонентов в уже существующий проект установщика.
  • QtIFW — относительно низкоуровневый инструмент по сравнению с некоторыми платформо-специфичными решениями (например, специализированными мастерами создания MSI с богатым визуальным редактором) — для команд, привыкших к визуальным инструментам конструирования установщиков, переход на XML-based декларативное описание QtIFW первое время может ощущаться менее интуитивным, хотя в долгосрочной перспективе декларативный, версионируемый в Git подход обычно оказывается удобнее для команды разработки.
  • Выбор между QtIFW и нативными инструментами платформы не всегда очевиден. Для приложения, распространяемого исключительно на одной платформе (например, только Windows), нативный MSI через WiX или другой специализированный Windows-инструмент может дать более глубокую интеграцию с системными механизмами (Windows Installer, групповые политики корпоративного развёртывания) — QtIFW оправдан прежде всего своей кросс-платформенностью, и эта выгода реализуется в полной мере именно при необходимости поддерживать несколько ОС из единого описания, что подробнее сравнивается в статье 216.