Qt installer framework обработка ошибок

Обновлено: 06.07.2024

Иногда, когда я использую maintenancetool.exe на Windows с "компонентами обновления", после загрузки и установки обновления отображается ошибка::

Ошибка в процессе установки (com.myapp.windows_x86_64): не удается записать файл лицензии: C:\Program Files(x86)/MyApp/Licenses\license.txt

с возможностью проигнорировать ошибку, повторить попытку или выйти. Я не могу понять, как предотвратить эту ошибку. Мой файл package.xml имеет следующую строку:

Edit: я понял, что непреднамеренно использую qt installer framework версии 1, так что это может быть ошибка QTIFW-315 , как указал Серджио. Я обновился до версии 3, и это, кажется, решает проблему.

1 ответ

В настоящее время я использую фреймворк установщика Qt и сумел создать онлайн-репозиторий. Вот что я хочу знать: Предоставляет ли фреймворк какой-то механизм auto-update, например плагин/сервис, который проверяет наличие обновлений каждый раз при запуске программы/системы? Проверить наличие.

Как скрыть выбранную папку установки с помощью qt installer Framework?

Я проверил трекер ошибок Qt, и до сих пор никто не сообщал о подобной проблеме. Было бы полезно знать, происходит ли это с разными компьютерами или только с одним.

Надеюсь, это поможет.

Похожие вопросы:

Инструмент обслуживания, который поставляется в комплекте с онлайн-установщиками для приложений Qt, предположительно может быть запущен без головы с флагом --checkupdates, который возвращает.

Я смог создать установку для своего программного обеспечения. Однако я не могу понять, как создать еще один установщик, который мог бы обновить предыдущую установку. У меня есть обновленные версии.

Я использую Qt Installer framework 1.5 После установки я хотел бы добавить ярлык на рабочий стол. В моем файле installscript.qs я попытался : Component.prototype.createOperationsForPath = function().

В настоящее время я использую фреймворк установщика Qt и сумел создать онлайн-репозиторий. Вот что я хочу знать: Предоставляет ли фреймворк какой-то механизм auto-update, например плагин/сервис.

Как скрыть выбранную папку установки с помощью qt installer Framework?

Я провел много исследований по обработке ошибок с Qt / C++, и я все еще так же потерян, как и в начале. Возможно, я ищу простой выход (как и другие языки). Один, в частности, предусматривает необработанное исключение, которое я использую религиозно. Когда программа сталкивается с проблемой, она выдает необработанное исключение, чтобы я мог создать свой собственный отчет об ошибке. Этот отчет отправляется с моей машины клиентов на сервер в интернете, который я затем прочитал позже.

проблема, с которой я сталкиваюсь с C++, заключается в том, что любая обработка ошибок, которая сделана, должна быть продумана до руки (подумайте, попробуйте/поймайте или массивные условные обозначения). По моему опыту, проблемы в коде не рассматриваются раньше, чем рука, иначе не было бы проблемы с самого начала.

написание кросс-платформенного приложения без кросс-платформенной обработки ошибок/отчетности / механизма трассировки немного пугает меня.

мой вопрос: есть ли в Qt или C++ Конкретный механизм захвата ошибок "catch-all", который я могу использовать в своем приложении, чтобы, если что-то пойдет не так, я мог, по крайней мере, написать отчет до его сбоя?

переопределить QCoreApplication::оповестить() и добавьте try-catch там. Это, и что-то в main() охватывает большинство случаев в моем опыте.

вот как я это делаю. Обратите внимание, что я использую C++ RTTI здесь, а не версию Qt, но это просто для удобства в наших приложениях. Кроме того, мы разместили QMessageBox с информацией и ссылкой на наш лог-файл. Вы должны расширяться в соответствии со своими потребностями.

кроме того, мы используем __try, __кроме Windows для поймать asyncronous исключения (нарушения доступа). Google Breakpad, вероятно, может служить кросс-платформенной заменой для этого.

вы можете поставить ловушку (. ) в функции main() вот здесь:

Google Breakpad-это кросс-платформенная платформа отчетов об ошибках приложений. Может, это поможет?

(Я еще не пробовал это в наших приложениях C++/qt, но я бы хотел когда-нибудь это сделать. )

Qt обычно не использует или полностью поддерживает исключение (если вы можете в это поверить!)

проверьте эти ссылки:

тем не менее, ответы от @Crazy Eddie и @Macke довольно хороши, но не всегда работают. В частности, я обнаружил, что вы не можете использовать ни один из них из функции слота, которую вы вызвали из В QML. Итак, я создал хакерскую работу для этой проблемы. * Используйте это в сочетании с их-не вместо него.

во-первых, я создал класс, производный от QException, который я пропущу здесь, но это то, что вы, вероятно, захотите сделать. В этом посте я просто называю его "MyQException".

в любом случае, добавьте этот заголовок для класса под названием QmlSlotThrower :

Подскажите пожалуйста, как в QT наиболее красивым способом можно обрабатывать ошибки. К своему удивлению в библиотеке не обнаружил ни одного класса для этого. Неужели по-старому (try. catch) ? И где (в QApplication::notify что ли) ?

ну в общем там дело такое. типа мы не хотим иметь дело с подобиями qexception, потому как не все компилеры понимают exceptions. маразм, но бороться можно. читать по линкам:

>ну в общем там дело такое. типа мы не хотим иметь дело с подобиями qexception, потому как не все компилеры понимают exceptions. маразм, но бороться можно. читать по линкам:

Маразм в том, что компилеры не поддерживают?
А вообще исключений нужно избегать, не только из-за того, что компиляторы с ними не дружат, но и по другим причинам.

Что подразумевается под "красивым способом" ?

другие причины это какие? пресловутое performance penalty? или размер бинарника? да глупость это. а маразм в позиции той, что типа не будем делать нах, потому что какое-то экзотическое страрье не поддерживает. :) (namespaces то уж куда позже были, а не - юзают) :)

Под "красивостью" полагалась обработка ситуаций узкозаточенными классами исключений, как это сделано в Java

>другие причины это какие? пресловутое performance penalty? или размер бинарника? да глупость это. а маразм в позиции той, что типа не будем делать нах, потому что какое-то экзотическое страрье не поддерживает. :) (namespaces то уж куда позже были, а не - юзают) :)

Легко так рассуждать, когда больше 2-3 компиляторов не используешь ;)
А чтобы поддерживать тот зоопарк компиляторов, который поддерживает Qt, при этом не перегружая код макросами.
Я не думаю, что троли просто так отказались от определенных возможностей языка (без которых, как видно, можно было обойтись)
А исключения имеют дурную репутацию из-за несовместимой реализации различными компиляторами.

По поводу производительности.
Может, для вас это и все равно, но для пользователей этот вопрос актуален.
Также не забывайте, что Qt поддерживает наладонники, нужно подумать и об этой категории пользователей.

Правильный программист - это ленивый программист. Если есть возможность что-то автоматизировать, то обязательно нужно это сделать. Например, можно сделать автоматическое выполнение windeployqt со сборкой онлайн и оффлайн инсталляторов, а также подготовкой репозитория приложения с помощью Qt Installer Framework и чёрной магии QMake .

Для того, чтобы сделать это наиболее красивым образом, необходимо, чтобы проект был организован со структурой subdirs , то есть состоял из нескольких проектов. Нам же не нужно при каждой сборке проекта создавать инсталляторы. Поэтому проект инсталлятора будет отдельным.

Но автоматизацию windeployqt оставим в основном проекте.

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

Итак, имеем проект, с двумя подпроектами:

  1. Hello.pro - проект приложения
  2. Installer.pro - проект инсталлятора

Основной проект представляет собой самый обычный "Hello world", но самый большой интерес заключается в скрипте QMake, который отвечает за windeployqt приложения.

Второй проект имеет минимальную структуру для сборки оффлайн и онлайн инсталляторов, а также сборки репозитория. Скрипт QMake в профайле проекта также содержит необходимую информацию для автоматизации сборки инсталляторов.

Автоматизация WinDeployQt

HelloInstaller.pro

Данный файл имеет традиционное содержание для subdirs проекта.

Hello.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 - в данном файле будет содержаться информация об удалённом репозитории, версии, названии проекта и т.д.
    • ru.evileg.helloinstaller - директория первого пакета
      • meta - директория, которая содержит инсталляионные скрипты, которые будут описывать специфичный функционал, например, закрытие активного экземпляра приложения, если производится обновление приложения, или прописывание информации в реестр системы.
        • package.xml - в минимальном варианте требуется наличие данного файла, который будет описываться версию и дату сборки проекта. Эта информация потребуется для формирования файла Updates.xml, который будет помещён в онлайн репозиторий.

        config.xml

        Файл, в котором описана служебная информация об издателе, пути установки приложения, его версии и названии. А также приводится информация об адресе удалённого репозитория. Данная информация будет одинакова, как для онлайн инсталлятора, так и для оффлайн инсталлятора. Ведь нам нужно будет помимо прочего ещё и обновлять приложение, поэтому для обоих версий инсталляторов нужна информация об удалённом репозитории.

        • Installer - формируемый инсталлятор
          • Name - Наименование приложения
          • Version - Версия приложения
          • Title - Заглавие окна инсталлятора
          • Publisher - Издатель
          • StartMenuDir - указывает группу продуктов, к которой принадлежит приложение в стартовом меню Windows.
          • TargetDir - папка установки приложения; @RootDir@ - корневая папка. В данном случае C:\
            • AllowSpaceInPath - разрешить пробелы в пути к директории
            • Repository - один из онлайн репозиториев, их может быть несколько, либо они могут даже заменяться
            • Url - адрес репозитория

            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 - указывает, что необходимо обновить репозиторий по следующему пути. Если по этому пути нет репозитория, то будет создан новый.

            Видеоурок

            Читайте также: