Тихая установка программы установки Qt на сервере ubuntu

Я хотел знать, есть ли способ сделать тихую установку установщика запуска Qt на сервере Ubuntu?
Я имею в виду обход опций установщика и установку по умолчанию?

Ответ 1

Инструментарий Qt упакован с использованием Qt Installer Framework (QtIFW). Установщики QtIFW поддерживают --script которая позволяет программно контролировать установку через API сценариев контроллера. Вот файл qt-installer-noninteractive.qs для qt-installer-noninteractive.qs установки Qt 5:

// Emacs mode hint: -*- mode: JavaScript -*-

function Controller() {
    installer.autoRejectMessageBoxes();
    installer.installationFinished.connect(function() {
        gui.clickButton(buttons.NextButton);
    })
}

Controller.prototype.WelcomePageCallback = function() {
    // click delay here because the next button is initially disabled for ~1 second
    gui.clickButton(buttons.NextButton, 3000);
}

Controller.prototype.CredentialsPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.IntroductionPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.TargetDirectoryPageCallback = function()
{
    gui.currentPageWidget().TargetDirectoryLineEdit.setText(installer.value("HomeDir") + "/Qt");
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.ComponentSelectionPageCallback = function() {
    var widget = gui.currentPageWidget();

    widget.deselectAll();
    widget.selectComponent("qt.55.gcc_64");
    widget.selectComponent("qt.55.qtquickcontrols");

    // widget.deselectComponent("qt.tools.qtcreator");
    // widget.deselectComponent("qt.55.qt3d");
    // widget.deselectComponent("qt.55.qtcanvas3d");
    // widget.deselectComponent("qt.55.qtlocation");
    // widget.deselectComponent("qt.55.qtquick1");
    // widget.deselectComponent("qt.55.qtscript");
    // widget.deselectComponent("qt.55.qtwebengine");
    // widget.deselectComponent("qt.extras");
    // widget.deselectComponent("qt.tools.doc");
    // widget.deselectComponent("qt.tools.examples");

    gui.clickButton(buttons.NextButton);
}

Controller.prototype.LicenseAgreementPageCallback = function() {
    gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true);
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.StartMenuDirectoryPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.ReadyForInstallationPageCallback = function()
{
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.FinishedPageCallback = function() {
var checkBoxForm = gui.currentPageWidget().LaunchQtCreatorCheckBoxForm;
if (checkBoxForm && checkBoxForm.launchQtCreatorCheckBox) {
    checkBoxForm.launchQtCreatorCheckBox.checked = false;
}
    gui.clickButton(buttons.FinishButton);
}

Этот скрипт демонстрирует, как выбрать/отменить выбор определенных компонентов. Настройте для ваших нужд или просто полностью удалите строки для установки по умолчанию. Точно так же вы можете настроить или удалить строку TargetDirectoryLineEdit. Запустите установщик Qt, например:

qt-opensource-linux-x64-5.5.1.run --script qt-installer-noninteractive.qs

Добавьте -platform minimal для установки без головы. Будущие установщики, основанные на более новых версиях QtIFW, должны вместо этого использовать опцию --silent (см. QTIFW-166).

Добавьте --verbose для более подробного вывода на консоль (полезно для подбора имен компонентов, имен страниц мастера и т.д.). Эта ссылка также полезна для определения имен компонентов.

Ответ 2

Начиная с установки 3.0.2-online 29-11-2017, вы должны добавить задержку в свой JS script, потому что кнопка "Далее" на странице "Добро пожаловать" отключена на одну секунду или около того.

Controller.prototype.WelcomePageCallback = function() {
    gui.clickButton(buttons.NextButton, 3000);
}

Ответ 3

Есть несколько незначительных отличий в ответе на вопросы мастера для другой версии Qt. Чтобы сделать его более простым, я собрал общий сценарий для извлечения Qt из автономного/онлайн-установщика.

Сценарий: qtci/extract-qt-installer на master · benlau/qtci

Пример использования:

extract-qt-installer qt-opensource-linux-x64-android-5.5.1.run ~/Qt

Переменные среды "

VERBOSE [Optional] Set to "true" will enable VERBOSE output
QT_CI_PAGEAGES [Optional] Select the components to be installed instead of using default (eg. QT_CI_PAGEAGES="qt.59.gcc_64")

Более того, у него мало скриптов для загрузки и установки Qt с разными версиями.

qtci/рецепты у мастера · benlau/qtci

Ответ 4

У меня была та же проблема, и я придумал простой скрипт на python, который в основном делает то же, что и официальный установщик Qt. Вы можете найти это здесь.

И то, как это использовать:

sudo apt install python3-requests p7zip-full wget

wget https://git.kaidan.im/lnj/qli-installer/raw/master/qli-installer.py
chmod +x qli-installer.py

./qli-installer.py 5.11.3 linux desktop

Тогда установку Qt можно найти по адресу ./5.11.3/gcc_64/ в этом случае. С другими системами/целями (например, mac ios или linux android android_armv7) это, конечно, будет отличаться.

https://lnj.gitlab.io/post/qli-installer/

Ответ 5

Сценарий выше старый. Это должно работать (и я добавил повтор для ошибок загрузки)

function Controller() {
    installer.autoRejectMessageBoxes();
    installer.setMessageBoxAutomaticAnswer("installationError", QMessageBox.Retry);
    installer.setMessageBoxAutomaticAnswer("installationErrorWithRetry", QMessageBox.Retry);
    installer.setMessageBoxAutomaticAnswer("DownloadError", QMessageBox.Retry);
    installer.setMessageBoxAutomaticAnswer("archiveDownloadError", QMessageBox.Retry);
    installer.installationFinished.connect(function() {
        gui.clickButton(buttons.NextButton);
    })
}

Controller.prototype.WelcomePageCallback = function() {
    // click delay here because the next button is initially disabled for ~1 second
    gui.clickButton(buttons.NextButton, 3000);
}

Controller.prototype.CredentialsPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.IntroductionPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.TargetDirectoryPageCallback = function()
{
    //dev is the user in our docker image
    gui.currentPageWidget().TargetDirectoryLineEdit.setText(installer.value("HomeDir") + "/Qt");
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.PerformInstallationPageCallback = function() {
    gui.clickButton(buttons.CommitButton);
}

Controller.prototype.ComponentSelectionPageCallback = function() {
    function list_packages() {
      var components = installer.components();
      console.log("Available components: " + components.length);
      var packages = ["Packages: "];
      for (var i = 0 ; i < components.length ;i++) {
          packages.push(components[i].name);
      }
      console.log(packages.join(" "));
    }

    list_packages();

    var widget = gui.currentPageWidget();

    console.log(widget);

    widget.deselectAll();
    widget.selectComponent("qt.qt5.5130");
    widget.selectComponent("qt.qt5.5130.gcc_64");
    // widget.deselectComponent("");

    gui.clickButton(buttons.NextButton);
}

Controller.prototype.LicenseAgreementPageCallback = function() {
    gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true);
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.StartMenuDirectoryPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.ReadyForInstallationPageCallback = function()
{
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.FinishedPageCallback = function() {
    var checkBoxForm = gui.currentPageWidget().LaunchQtCreatorCheckBoxForm;
    if (checkBoxForm && checkBoxForm.launchQtCreatorCheckBox) {
        checkBoxForm.launchQtCreatorCheckBox.checked = false;
    }
    gui.clickButton(buttons.FinishButton);
}

работать с многословным, так что вам не придется ждать слишком много времени без вывода

qt.run -platform minimal --verbose --script ./qt-installer-noninteractive.qs 

Ответ 6

Обход экрана "Сбор данных пользователя"

С 8 октября 2019 года в Windows добавлен дополнительный экран, который приведет к зависанию установки. Вы можете щелкнуть по нему, добавив в файл .qs следующее:

Controller.prototype.DynamicTelemetryPluginFormCallback = function() {
    var widget = gui.currentPageWidget();
    widget.TelemetryPluginForm.statisticGroupBox.disableStatisticRadioButton.checked = true;
    gui.clickButton(buttons.NextButton);
}

Выбор "Архив" и "Последние выпуски"

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

Вот как это сделать:

Controller.prototype.ComponentSelectionPageCallback = function() {
    var page = gui.pageWidgetByObjectName("ComponentSelectionPage");

    var archiveCheckBox = gui.findChild(page, "Archive");
    var latestCheckBox = gui.findChild(page, "Latest releases");
    var fetchButton = gui.findChild(page, "FetchCategoryButton");

    archiveCheckBox.click();
    latestCheckBox.click();
    fetchButton.click();

    // ...
}

Смотрите здесь для более полного примера для Windows.

Ответ 7

Это работает для меня!

 export DISPLAY=:1
 Xvfb :1 -screen 0 1024x768x16 &
 fluxbox &
 x11vnc -display :1 &

Подключиться к серверу с помощью любого клиента VNC

Ответ 8

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

Примечания и Особенности:

  • Работает в Linux, MacOS и Windows.
  • Версия Qt, компоненты и путь установки настраиваются.
  • Всегда использует самый последний онлайн-установщик.
  • Проверено в Travis CI.
  • Требуется Bash, но обычно он присутствует на серверах непрерывной интеграции (по крайней мере, на Travis).
  • Общественное достояние (через CC0 waiver).

Домашняя страница: https://github.com/skalee/non-interactive-qt-installer