Qt installer framework обработка ошибок
Иногда, когда я использую 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 оставим в основном проекте.
Структура проекта
Итак, имеем проект, с двумя подпроектами:
- Hello.pro - проект приложения
- 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 - указывает, что необходимо обновить репозиторий по следующему пути. Если по этому пути нет репозитория, то будет создан новый.
Видеоурок
Читайте также:
- meta - директория, которая содержит инсталляионные скрипты, которые будут описывать специфичный функционал, например, закрытие активного экземпляра приложения, если производится обновление приложения, или прописывание информации в реестр системы.