Автоматизация инструментов Qt

Здравствуйте уважаемы хабровчане, не так давно я увлекся программированием на 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.


Ссылка на репозиторий github


P.S. Это моя первая программа, выложенная в открытый доступ широкой публике, буду рад всем замечаниям. Как всегда здоровая критика приветствуется. Также буду очень рад предложениям по увеличению функционала программы.

Средняя зарплата в IT

111 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 7 247 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 13

    0
    При установке Qt есть какой-то пакет «QT Installer», чтобы инсталляторы делать. Я его ещё не изучал, но разве он не сделает всё нужное?
      +2
      Сделает, но что бы он сделал нужно создать файл config.xml и папки с пакетами и их описанием, плюс потом вводить в консоль (согласен, не самое трудное занятие, но все), а тут через графический интерфейс, более понятно и очевидно так сказать.
      0

      Хорошо, что вы сделали GUI, но я правильно понял, что вы поддерживаете только Windows?
      Так же в коде у вас тотальное отсутствие защиты от каких-либо ошибок. Даже в лог ничего не выводите.

        0
        Пока что только Windows, вы правы, в будущем буду расширяться. Защиту вы имеете в виду какую? При выполнении утилит или в принципе в ходе работы программы (краши и т. д.)?
          0

          При выполнении утилит в основном. Если ошибка — тупо ничего не делать. Плюс очень много конструкций вида if-else и какого-то хардкода. Будут проблемы с расширяемостью.

            0
            Ошибки при выполнении утилит пишутся в диалог красным цветом. А что нужно делать если пользователь неправильно указал аргументы?
        –6

        Коммиты и описание на русском! Теперь я видел всё.

          +1

          Генерация qmldir как мне кажется не совсем верное решение задачи проектирования QML библиотеки. Наверное для простеньких программ подходит такое решение. Но изначально в qmldir нужно записывать только публичные интерфейсы библиотеки. Думаю вам стоит учесть это и добавить выборку файлов которые должны быть добавлены в qmldir.


          Так же позволю себе несколько замечаний по коду:


          • Не используйте import Qt.labs.platform 1.1, темболее для FileDialog которые уже устаканились и есть в освном дереве
          • Не храните в репозитории .pro.user*, добавьте исключения в .gitignore, на гитхабе есть примеры для Qt
          • Не используйте кириллицу в коде. Не весь мир пользуется сгенерированными кириллическими кодировками.
          • .qm файлы это результат генерации из .ts файлов, хранить их в репозитории ни к чему
            0
            Для скрытых файлов библиотек есть директива internal в qmldir, программа позволяет это указать. Не видел FileDialog в основном дереве, спасибо за наводку, посмотрю. .pro.user — да вроде добавлял, но все равно его пушит, видимо я что-то не так делаю. «Кириллица в коде», это вы предлагаете писать интерфейс на английском а потом переводить? Насчет qm файлов понял, спасибо.
              +1
              «Кириллица в коде», это вы предлагаете писать интерфейс на английском а потом переводить?

              Именно

                0
                Понял, учту, спасибо.
                +1
                В нашем продукте тоже в коде сплошняком кириллица. Исключение: когда есть вывод в консоль. Всё, что выводится средствами qt — на русском. Ибо, какая разница с какого на какой язык переводить?

                Единственный аргумент, который я вижу, в пользу английского интерфейса: open source. Просто наш продукт полностью проприетарен, а все разработчики русские.
                  +3
                  .pro.user — да вроде добавлял, но все равно его пушит, видимо я что-то не так делаю

                  Если вы файл закоммитили до того, как прописали в .gitignore, то git будет его отслеживать. Попробуйте удалить файл из репозитория и пересоздать, после этого git должен перестать пытаться его коммитить.


                  Кроме того, глядя на маски, которые у вас в .gitignore: файлы вида QtAutoTools.pro.user.d3e52c4 (с хешем после user) под них не попадают, только QtAutoTools.pro.user. Надо что-то вроде *.user.*, либо QtAutoTools.pro.user.*

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое