Я хотел знать, есть ли способ сделать тихую установку установщика запуска 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 с разными версиями.
Ответ 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
) это, конечно, будет отличаться.
Ответ 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