Здравствуйте уважаемы хабровчане, не так давно я увлекся программированием на 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. Это моя первая программа, выложенная в открытый доступ широкой публике, буду рад всем замечаниям. Как всегда здоровая критика приветствуется. Также буду очень рад предложениям по увеличению функционала программы.

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


  1. maaGames
    02.01.2020 15:17

    При установке Qt есть какой-то пакет «QT Installer», чтобы инсталляторы делать. Я его ещё не изучал, но разве он не сделает всё нужное?


    1. zl0i Автор
      02.01.2020 15:25
      +1

      Сделает, но что бы он сделал нужно создать файл config.xml и папки с пакетами и их описанием, плюс потом вводить в консоль (согласен, не самое трудное занятие, но все), а тут через графический интерфейс, более понятно и очевидно так сказать.


  1. Sazonov
    02.01.2020 17:20

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


    1. zl0i Автор
      02.01.2020 17:36

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


      1. Sazonov
        02.01.2020 20:46

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


        1. zl0i Автор
          03.01.2020 13:11

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


  1. chapuza
    02.01.2020 17:24
    -3

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


  1. semlanik
    02.01.2020 17:32

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


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


    • Не используйте import Qt.labs.platform 1.1, темболее для FileDialog которые уже устаканились и есть в освном дереве
    • Не храните в репозитории .pro.user*, добавьте исключения в .gitignore, на гитхабе есть примеры для Qt
    • Не используйте кириллицу в коде. Не весь мир пользуется сгенерированными кириллическими кодировками.
    • .qm файлы это результат генерации из .ts файлов, хранить их в репозитории ни к чему


    1. zl0i Автор
      02.01.2020 17:41

      Для скрытых файлов библиотек есть директива internal в qmldir, программа позволяет это указать. Не видел FileDialog в основном дереве, спасибо за наводку, посмотрю. .pro.user — да вроде добавлял, но все равно его пушит, видимо я что-то не так делаю. «Кириллица в коде», это вы предлагаете писать интерфейс на английском а потом переводить? Насчет qm файлов понял, спасибо.


      1. semlanik
        02.01.2020 17:52

        «Кириллица в коде», это вы предлагаете писать интерфейс на английском а потом переводить?

        Именно


        1. zl0i Автор
          02.01.2020 17:54

          Понял, учту, спасибо.


      1. IkaR49
        02.01.2020 19:53

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

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


      1. 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.*