Введение
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.