這篇算是《GitLab CI + Windows Docker 的一些紀錄》的延伸。由於 Heresy 這邊的開發專案有用到 Qt SDK(官網),所以在建置用的 Docker 容器裡面,也需要安裝 Qt 的 SDK。
但是由於 Qt 現在的線上安裝程式也都是以圖形介面為主,並在圖形介面中選擇要安裝那些套件;所以要怎麼在沒有圖形介面的 Docker 內安裝,就需要稍微研究一下了。
在找了一些資料後,可以知道 Qt 的安裝程式框架(Qt Installer Framework、QTIFW、官方文件)是有支援使用腳本(script)來做控制的!(官方文件)
而在網路上,也可以找到使用這樣的機制,來自動安裝 Qt 的腳本範例。Heresy 這邊是參考《How can I install Qt 5.2.1 from the command line in Cygwin?》的例子。
下面就是目前使用的檔案、qt-install.qs:
function Controller() {
installer.autoRejectMessageBoxes();
installer.installationFinished.connect(function() {
gui.clickButton(buttons.NextButton);
}) } Controller.prototype.WelcomePageCallback = function() {
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("C:/Qt/");
gui.clickButton(buttons.NextButton); } Controller.prototype.ComponentSelectionPageCallback = function() {
var widget = gui.currentPageWidget();
widget.deselectAll();
widget.selectComponent("qt.qt5.5131.win64_msvc2017_64");
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); }
這邊主要的概念,基本上就是在介面出現(實際上也不會真的出現)後,讓安裝程式自己去按 Next 的按鈕。
而可能要修改的地方,則是 TargetDirectoryPageCallback 和 ComponentSelectionPageCallback;前者是指定要把 Qt 安裝到哪裡(這邊是 c:/Qt/)、後者則是選擇要安裝的套件。
在套件名稱的部分,可以參考官方的 Qt SDK Repository(連結);點選需要的 Qt SDK 版本後(例如這邊是選 qt5_5131),裡面的資料夾名稱基本上就是套件的名稱了。
而 Heresy 這邊因為只有用到 Visual C++ 2017 x64 環境下最基本的東西,所以只要選擇 qt.qt5.5131.win64_msvc2017_64 就可以了。如果有需要其他模組的話,也可以自行添加 widget.selectComponent() 命令。
之後呢,只要下載 Qt 的安裝程式(網站),透過下面的指令:
qt-unified-windows-x86-online.exe --script qt-install.qs
就可以在沒有圖形介面的情況下、完成安裝了。
而如果希望有訊息顯示的話,則可以再加上「-v」、來顯示安裝進度。
基本上,這樣就可以用了,也可以成功地放進 Dockerfile 裡面執行。
不過,目前是還有兩個小問題:
-
Qt 下載的時候,由於台灣似乎沒有鏡像站,所以都是連到大陸去下載,速度很慢…
然後研究了一陣子,又不知道怎麼透過角本或指令來設定 proxy(他只能設定開或關),變得滿麻煩的。 -
不知道為什麼,有的啥後記錄出現「
Using control script:
」後就不動了。
但是通常重跑一次就好了,所以暫時就不管了。
由於基本上問題都不算太大,所以應該就先這樣用了吧。
[…] Heresy 之前在《在 Windows 命令提示字元安裝 Qt SDK》一文中,也有整理當時可以用的安裝方法。 […]
讚讚
[…] 之前有寫了一篇《在 Windows 命令提示字元安裝 Qt SDK》,大概紀錄了一下,在沒有圖形介面的環境下,使用腳本來安裝 Qt SDK 的方法。 […]
讚讚