Здравствуйте уважаемы хабровчане, не так давно я увлекся программированием на Qt и после написания нескольких программ встал вопрос о том, как развертывать программы на других компьютерах. Как выяснилось делать это не совсем удобно, поэтому я решил написать простенькую небольшую программу, с приятным графическим интерфейсом, в которой можно было бы легко, даже без основных знаний, создать деплой и установщик программы. Всех заинтересованных прошу под кат.
Все началось с того, что нужно было деплоить много разных проектов и каждый раз писать в консоли много букв не хотелось (вот оно молодое поколение!). Так как у меня был опыт работы с qt и qml, я решил запилить свое приложение.
Основные требования были очевидны сразу — программа должна делать деплои и установщики под Windows. У Qt есть windeployqt и Qt Installer Framework для данных задач. Также сразу захотелось добавить автоматическую генерацию файла qmldir и файлов перевода.
Изначально я не стал рисовать дизайн, а просто думал на ходу и делал, это оказалось ошибкой, так как сложно учесть и удержать в голове все детали и возможности программы. Из-за этого первая программа оказалась плохо проработанной и практически не настраиваемой. Но она работала! Для запуска утилит я создаю bat файл, устанавливаю там рабочее окружение:
set PATH=G:\Qt\5.13.2\mingw73_64/bin;G:\Qt\Tools\mingw730_64/bin;%PATH%\n
А дальше прописываю ту утилиту которую мне нужно, с добавленными к ней настроенными пользователем аргументами. С помощью QProcess запускаю данный файл на выполнение. Так делается с развертыванием, установщиком и lupdate ( генерация файлов перевода), в случае с qmldir никакие процессы в принципе не нужны, так как идет простое копирование названий файлов.
Хоть программа и работала, меня она не устраивала, слишком мало настроек, при ошибках в аргументах программа ничего не выводила пользователю. Нужно было переделывать. На этот раз я решил нарисовать все в Figma, разложить все по полочкам, прорефракторить код.
В итоге получилось довольно симпатично на мой взгляд (я далеко не дизайнер). Также переделал окно работы утилиты, теперь она выводит все что пишет утилита в консоль и сообщает о завершении работы симпатичной кнопкой.
После завершения работы над дизайном, начал постепенно переделывать каждую утилиту. В windeployqt изменений почти не было, добавилась только настройка еще одного аргумента. В qmldir добавились функции по выбору модификаторов для каждого файла и выбор версии, генерация файла .*qmltypes с автоматической записью в qmldir. Самые больше изменения коснулись installer, там просто куча параметров, с выбором и настройкой каждого package и файла config.xml с удаленными репозиториями. Программа сама создает структуру папок, файлов настройки (config.xml и package.xml) и заполняет их, также происходит копирование самих пакетов в папку data. Можно создать 3 типа установщиков: только офлайн, только онлайн и совмещённый, есть еще и 4 тип, когда из установщика исключаются определённые пакеты, но я решил что данный функционал не столь важен в первое время и его я добавлю в следующих версиях. Для удаленных установщиков необходимо создавать репозитории с помощью repogen.exe, программа также умеет это делать.
Для работы программы необходимо указать папку Qt на компьютере, путь до компилятора в номере версии Qt и путь до компилятора в папке Tools. Я понимаю что это не самое удобное решение и поэтому в будущих версиях сделаю парсинг папки Qt, с выбором компилятора через ComboBox.
Однако работа еще не закончена до конца, каждый раз вбивать одни и те же значения неудобно, да и неправильно, нужно и это как то автоматизировать, например создать раздел Scripts, где хранить данные для запуска утилит. Также хочется добавить macdeployqt и linuxdeployqt.
P.S. Это моя первая программа, выложенная в открытый доступ широкой публике, буду рад всем замечаниям. Как всегда здоровая критика приветствуется. Также буду очень рад предложениям по увеличению функционала программы.
Комментарии (13)
Sazonov
02.01.2020 17:20Хорошо, что вы сделали GUI, но я правильно понял, что вы поддерживаете только Windows?
Так же в коде у вас тотальное отсутствие защиты от каких-либо ошибок. Даже в лог ничего не выводите.zl0i Автор
02.01.2020 17:36Пока что только Windows, вы правы, в будущем буду расширяться. Защиту вы имеете в виду какую? При выполнении утилит или в принципе в ходе работы программы (краши и т. д.)?
Sazonov
02.01.2020 20:46При выполнении утилит в основном. Если ошибка — тупо ничего не делать. Плюс очень много конструкций вида if-else и какого-то хардкода. Будут проблемы с расширяемостью.
zl0i Автор
03.01.2020 13:11Ошибки при выполнении утилит пишутся в диалог красным цветом. А что нужно делать если пользователь неправильно указал аргументы?
semlanik
02.01.2020 17:32Генерация qmldir как мне кажется не совсем верное решение задачи проектирования QML библиотеки. Наверное для простеньких программ подходит такое решение. Но изначально в qmldir нужно записывать только публичные интерфейсы библиотеки. Думаю вам стоит учесть это и добавить выборку файлов которые должны быть добавлены в qmldir.
Так же позволю себе несколько замечаний по коду:
- Не используйте import Qt.labs.platform 1.1, темболее для FileDialog которые уже устаканились и есть в освном дереве
- Не храните в репозитории .pro.user*, добавьте исключения в .gitignore, на гитхабе есть примеры для Qt
- Не используйте кириллицу в коде. Не весь мир пользуется сгенерированными кириллическими кодировками.
- .qm файлы это результат генерации из .ts файлов, хранить их в репозитории ни к чему
zl0i Автор
02.01.2020 17:41Для скрытых файлов библиотек есть директива internal в qmldir, программа позволяет это указать. Не видел FileDialog в основном дереве, спасибо за наводку, посмотрю. .pro.user — да вроде добавлял, но все равно его пушит, видимо я что-то не так делаю. «Кириллица в коде», это вы предлагаете писать интерфейс на английском а потом переводить? Насчет qm файлов понял, спасибо.
IkaR49
02.01.2020 19:53В нашем продукте тоже в коде сплошняком кириллица. Исключение: когда есть вывод в консоль. Всё, что выводится средствами qt — на русском. Ибо, какая разница с какого на какой язык переводить?
Единственный аргумент, который я вижу, в пользу английского интерфейса: open source. Просто наш продукт полностью проприетарен, а все разработчики русские.
nikolayz
02.01.2020 20:53+2.pro.user — да вроде добавлял, но все равно его пушит, видимо я что-то не так делаю
Если вы файл закоммитили до того, как прописали в .gitignore, то git будет его отслеживать. Попробуйте удалить файл из репозитория и пересоздать, после этого git должен перестать пытаться его коммитить.
Кроме того, глядя на маски, которые у вас в .gitignore: файлы вида
QtAutoTools.pro.user.d3e52c4
(с хешем после user) под них не попадают, толькоQtAutoTools.pro.user
. Надо что-то вроде*.user.*
, либоQtAutoTools.pro.user.*
maaGames
При установке Qt есть какой-то пакет «QT Installer», чтобы инсталляторы делать. Я его ещё не изучал, но разве он не сделает всё нужное?
zl0i Автор
Сделает, но что бы он сделал нужно создать файл config.xml и папки с пакетами и их описанием, плюс потом вводить в консоль (согласен, не самое трудное занятие, но все), а тут через графический интерфейс, более понятно и очевидно так сказать.