我想知道是否有办法在Ubuntu Server上静默安装Qt运行安装程序?
我的意思是绕过安装程序的选项并进行默认安装?
答案 0 :(得分:55)
Qt工具包使用Qt安装程序框架(QtIFW)打包。 QtIFW安装程序支持--script
选项,允许您通过Controller Scripting API以编程方式控制安装。这里的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
以获得更详细的控制台输出(有助于收集组件名称,向导页面名称等)。 This link也有助于计算组件名称。
答案 1 :(得分:8)
从安装程序3.0.2-online
29-11-2017开始,您必须在JS脚本中添加延迟,因为“欢迎”页面中的“下一步”按钮被禁用一秒左右。
Controller.prototype.WelcomePageCallback = function() {
gui.clickButton(buttons.NextButton, 3000);
}
答案 2 :(得分:6)
对于不同类型的Qt,回答向导的问题几乎没有什么不同。为了使它更简单,我打包了一个通用脚本来从离线/在线安装程序中提取Qt。
脚本: qtci/extract-qt-installer at 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。
答案 3 :(得分:6)
自2019年10月8日起,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的更完整示例,请参见here。
答案 4 :(得分:2)
看看这个很棒的项目:aqtinstall
https://github.com/miurahr/aqtinstall/
它可以在Linux,Mac和Windows计算机上安装Qt,而无需任何交互。
还有一个使用此工具的Github操作:https://github.com/jurplel/install-qt-action
答案 5 :(得分:2)
从3.2.1开始,凭据现在是必需的,如上所述。在~/.local/share/qt
中创建了一个qtaccount.ini文件。如果您无法保存和重复使用该文件,例如由于您的脚本需要为多个用户使用,则可以使用此新的 CredentialsPageCallback
Controller.prototype.CredentialsPageCallback = function() {
var page = gui.pageWidgetByObjectName("CredentialsPage");
page.loginWidget.EmailLineEdit.setText("MYEMAIL");
page.loginWidget.PasswordLineEdit.setText("MYPASSWORD");
gui.clickButton(buttons.NextButton);
}
和往常一样,在移动密码时要特别小心,尤其是在明文形式的情况下。
答案 6 :(得分:1)
我遇到了同样的问题,并提出了一个简单的python脚本,该脚本的功能基本上与官方的Qt安装程序相同。您可以找到它here。
这就是使用它的方式:
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
然后在这种情况下,可以在./5.11.3/gcc_64/
处找到Qt安装。对于其他系统/目标(即mac ios
或linux android android_armv7
),这当然会有所不同。
答案 7 :(得分:1)
Qt安装程序v4.0
已发布,现在可以无头运行:
qt-unified-windows.exe install --root C:\Qt\InstallFolder
您可以使用--help
列出可用命令:
qt-unified-windows.exe --help
命令行安装程序需要用户交互,但是可以使用标志来绕过它。有关完整列表,请参见this wiki page。
您可以下载安装程序here。
答案 8 :(得分:0)
这对我有用!
export DISPLAY=:1
Xvfb :1 -screen 0 1024x768x16 &
fluxbox &
x11vnc -display :1 &
使用任何vnc客户端连接到服务器
答案 9 :(得分:0)
上面的脚本很旧。这应该可以工作(并且我添加了重试下载错误)
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
答案 10 :(得分:0)
几个月前,我为Qt安装自动化制作了可配置的帮助程序脚本。尽管它不是真正的无头安装程序,但它只是通过安装向导屏幕进行迭代,因此可以在连续集成服务器中使用,并且实际上已经通过这种方式进行了测试。
注意事项和功能:
答案 11 :(得分:0)
必须输入凭据才能通过凭据菜单。 为了避免有必要使用以下网络参数运行docker build命令:
docker build --network none -t <img_name> <Dockerfile_path>
要在docker中成功运行qt交互式安装,缺少了一些东西。