4、教程: 創建一個安裝程序
本教程介紹如何為小項目創建簡單的安裝程序:

本節介紹以下創建安裝程序 必須 完成的任務:
- 創建一個包(package)目錄,其中將包含所有配置文件和可安裝的包。
- 創建包含有關如何構建安裝程序二進制文件和聯機存儲庫的信息的配置文件。
- 創建包信息文件,其中包含有關可安裝組件的信息。
- 創建安裝程序內容並將其復制到軟件包(package)目錄中。
- 使用
binarycreator工具創建安裝程序。
安裝程序頁面是使用您在配置和程序包信息文件中提供的信息創建的。
示例文件位於Qt Installer Framework資源庫中的examples\tutorial目錄中。
創建軟件包目錄
創建一個反映安裝程序設計的目錄結構,並允許將來擴展安裝程序。 該目錄必須包含config和packages的子目錄。

有關軟件包目錄的詳細信息,請參閱Package Directory。
創建配置文件
在config目錄中,創建一個名為config.xml的文件,其中包含以下內容:
<?xml version="1.0" encoding="UTF-8"?>
<Installer>
<Name>Your application</Name>
<Version>1.0.0</Version>
<Title>Your application Installer</Title>
<Publisher>Your vendor</Publisher>
<StartMenuDir>Super App</StartMenuDir>
<TargetDir>@HomeDir@/InstallationDirectory</TargetDir>
</Installer>
該配置文件指定介紹頁面上顯示以下信息:
<Title元素指定顯示在標題欄 (下圖[1]) 上的安裝程序名稱。
<Name元素指定添加到頁面名稱和簡介文本 (下圖[2]) 的應用程序名稱。

其他元素用於自定義安裝程序的行為:
<Version>元素指定應用程序版本號。<Publisher>元素指定軟件的發布者(例如,在Windows控制面板中所示)。<StartMenuDir>元素指定Windows開始菜單中產品的默認程序組的名稱。<TargetDir>元素指定顯示給用戶的默認目標目錄是當前用戶的主目錄中的InstallationDirectory(因為預定義變量@HomeDir@用作值的一部分)。 有關詳細信息,請參閱預定義變量。
有關配置文件格式和可用元素的詳細信息,請參閱Configuration File。
創建程序包信息文件
在這種簡單的情況下,安裝程序只處理一個名為com.vendor.product的組件。 要向安裝程序提供有關組件的信息,請創建一個名為package.xml的文件,其中包含以下內容,並將其放在meta目錄中:
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>The root component</DisplayName>
<Description>Install this example.</Description>
<Version>0.1.0-1</Version>
<ReleaseDate>2010-09-21</ReleaseDate>
<Licenses>
<License name="Beer Public License Agreement" file="license.txt" />
</Licenses>
<Default>script</Default>
<Script>installscript.qs</Script>
<UserInterfaces>
<UserInterface>page.ui</UserInterface>
</UserInterfaces>
</Package>
下面更詳細地描述示例文件中的元素。
有關軟件包信息文件的詳細信息,請參閱Package Information File Syntax
指定組件信息
來自以下元素的信息顯示在組件選擇頁面上:
<DisplayName>元素指定組件列表中組件的名稱 (下圖[1]) 。
<Description>元素指定在選擇組件時顯示的文本 (下圖[2]) 。

指定安裝程序版本
<Versionss>元素使您能夠在用戶有可用更新時提醒用戶進行更新。
添加許可證
<License>元素指定包含許可協議文本 (下圖[1]) 的文件名稱,該文本顯示在許可檢查頁上:

選擇默認內容
<Default>元素指定默認情況下是否選擇組件。值為true的組件將設置為選定。 在此示例中,我們使用腳本在運行時解析值。 JavaScript腳本文件installscript.qs的名稱在<Script>元素中指定。
創建安裝程序內容
要安裝的內容存儲在組件的data目錄中。 因為只有一個組件,請將數據放在packages/com.vendor.product/data目錄中。 該示例已包含用於測試目的的文件,但您基本上可以將任何文件放在目錄中。
有關打包規則和選項的詳細信息,請參閱數據目錄。
創建安裝程序二進制文件
您現在可以創建您的第一個安裝程序。 在命令行上切換到examples\tutorial目錄。 要創建一個名為YourInstaller.exe一個安裝程序,其中包含com.vendor.product標識的包,輸入以下命令:
在Windows上:
..\..\bin\binarycreator.exe -c config\config.xml -p packages YourInstaller.exe
在Linux 或 OS 上:
../../bin/binarycreator -c config/config.xml -p packages YourInstaller
安裝程序會在當前目錄中創建,你可以提供給最終用戶。
有關使用binarycreator工具的更多信息,請參閱binarycreator。
注意:如果在運行教程安裝程序時顯示錯誤消息,請檢查是否使用靜態構建的Qt創建安裝程序。 有關更多信息,請參閱Configuring Qt。
5、創建安裝程序 Creating Installers
創建離線和聯機安裝程序需要以下步驟:
-
- 為可安裝組件創建包目錄。相關相信信息,請參閱Package Directory
-
- 在config目錄中創建一個名為
config.xml的配置文件。 它包含有關如何構建安裝程序二進制文件和聯機存儲庫的信息。 有關文件格式和可用設置的詳細信息,請參閱Configuration File
- 在config目錄中創建一個名為
-
- 在
config\meta目錄中創建一個名為package.xml的包信息文件。 它包含部署和安裝過程的設置。 有關詳細信息,請參閱Meta Directory
- 在
-
- 創建安裝程序內容並將其復制到軟件包目錄中。 有關詳細信息,請參閱Data Directory
-
- 對於聯機安裝程序,請使用
repogen工具創建包含可安裝內容的存儲庫,並將存儲庫上載到Web服務器。
- 對於聯機安裝程序,請使用
-
- 使用binarycreator工具創建安裝程序。 有關詳細信息,請參閱Tools
有關如何創建使用預定義安裝程序頁面的簡單安裝程序的示例,請參閱Tutorial: Creating an Installer
以下部分介紹如何創建不同類型的安裝程序:
創建離線安裝程序 Creating Offline Installers
在安裝期間, 離線安裝程序 根本不嘗試連接到聯機存儲庫。 但是,元數據配置(config.xml)中可以設置允許用戶在線添加和更新組件。
離線安裝程序在公司防火牆不允許最終用戶連接到Web服務器的情況下尤其有用。 網絡管理員可以在網絡中設置本地更新服務。
要創建離線安裝程序,請使用binarycreator工具的--offline-only選項。
要在Windows中創建離線安裝程序,請輸入以下命令:
<location-of-ifw>\binarycreator.exe --offline-only -t <location-of-ifw>\installerbase.exe -p <package_directory> -c <config_directory>\<config_file> <installer_name>
譯注:<location-of-ifw>表示binarycreator程序所在目錄。
某些選項具有默認值,所以,可以忽略它們。例如,輸入以下命令來創建名為SDKInstaller.exe的安裝程序二進制文件,其中包含由org.qt-project.sdk標識的軟件包及其依賴關系:
binarycreator.exe --offline-only -c installer-config -p installer-packes SDKInstaller.exe
創建在線安裝程序 Creating Online Installers
聯機安裝程序獲取一個不在二進制文件中的存儲庫描述(Update.xml)。創建存儲庫並將其上傳到Web服務器。 然后在用於創建安裝程序的config.xml文件中指定存儲庫的位置。
創建存儲庫 Creating Repositories
使用repogen工具創建一個軟件包目錄的所有軟件包的聯機存儲庫:
repogen.exe -p <package_directory> <repository_directory>
例如,要創建只包含org.qt-project.sdk.qt和org.qt-project.sdk.qtcreator的存儲庫,請輸入以下命令:
`
repogen.exe -p packages -i org.qt-project.sdk.qt,org.qt-project.sdk.qtcreator repository
創建存儲庫后,將其上傳到Web服務器。 您必須在安裝程序配置文件(config.xml)中指定存儲庫的位置。
配置存儲庫 Configuring Repositories
安裝程序配置文件(config.xml)中的<RemoteRepositories>元素可以包含多個存儲庫列表。 每個存儲庫都可以有以下設置項:
<Url>, 指向可用組件列表。<Enabled>, 0表示禁用此存儲庫。<Username>, 用於受保護存儲庫驗證的用戶名。<Password>, 用於受保護存儲庫驗證的密碼。<DisplayName>, 可選,設置要顯示的字符串,而不是URL。
URL需要指向列出可用組件的Updates.xml文件。 例如:
<RemoteRepositories>
<Repository>
<Url>http://www.example.com/packages</Url>
<Enabled>1</Enabled>
<Username>user</Username>
<Password>password</Password>
<DisplayName>Example repository</DisplayName>
</Repository>
</RemoteRepositories>
僅當安裝程序 可以訪問存儲庫 時,安裝程序才會繼續。 如果在安裝后訪問存儲庫,維護工具將拒絕安裝。 但是,卸載后可再次安裝。 默認情況下可以啟用或禁用存儲庫。 對於需要驗證的存儲庫,也可以在此處設置詳細信息,但在此輸入密碼通常不可取,因為它以純文本保存。 若此處未設置身份驗證詳細信息,將在 運行時通過對話框獲取 。 用戶可以在運行時解決這些設置。
創建安裝程序二進制文件 Creating Installer Binaries
要使用binarycreator工具創建聯機安裝程序,請輸入以下命令:
<location-of-ifw>\binarycreator.exe -t <location-of-ifw>\installerbase.exe -p <package_directory> -c <config_directory>\<config_file> -e <packages> <installer_name>
例如,輸入以下命令以創建名為SDKInstaller.exe的安裝程序二進制文件,其中 不包含 org.qt-project.sdk.qt和org.qt-project.qtcreator的數據,因為這些軟件包是 從遠程存儲庫下載 的:
binarycreator.exe -p installer-packages -c installer-config\config.xml -e org.qt-project.sdk.qt,org.qt-project.qtcreator SDKInstaller.exe
減少安裝程序文件大小 Reducing Installer Size
即使組件從Web服務器獲取,binarycreator 仍然會將它們添加到安裝程序二進制文件 中。 但是,當安裝程序檢查Web服務器上的更新時,如果新版本不可用,則最終用戶可以免於下載。
或者,您可以創建不包含任何數據僅從Web服務器獲取所有數據的聯機安裝程序。 使用binarycreator工具的-n參數,並且只將根(root)組件添加到安裝程序。 通常根(root)組件是空的,因此只添加根(root)的XML描述。
更多相關選項的詳細信息,請參閱Summary of binarycreator Parameters
促進更新 Promoting Updates
促進更新這是一個很別扭的翻譯,這里的意思是在運行聯機安裝程序的時候,會去讀取存儲庫中的Update.xml文件來判斷是否需要下載更新。
創建在聯機程序,以便能夠向最終安裝產品用戶促進更新。
需要以下步驟來促進更新:
-
- 復制要更新的內容到軟件包目錄。
-
- 增加
package.xml文件中已更新組件的<Version>元素的值。
- 增加
-
- 使用
repogen工具重新創建具有更新內容的聯機存儲庫,並在存儲庫的根目錄中生成Updates.xml文件。
- 使用
-
- 將存儲庫上傳到Web服務器。
-
- 使用
binarycreator工具創建安裝程序。
- 使用
配置更新 Configuring Updates
安裝程序在啟動時下載Updates.xml文件,並將安裝的版本與文件中的版本進行比較。 如果聯機版本號大於本地版本號,安裝程序將在可用更新列表中顯示它。
增加package.xml文件中組件的<Version>元素的值。
重新創建存儲庫 Recreating Repositories
提供更新的最簡單方法是重新創建資源庫,並上傳到Web服務器。 有關更多信息,請參閱創建存儲庫 Creating Repositories
部分更新存儲庫
整個庫完全更新可能不是最優的,如果:
- 存儲庫非常大,因為上傳需要很長時間。
- 你想只提供更新的組件。
注意: repogen會在每次調用時重新創建7zip存檔。 由於7zip存儲所包含的文件的時間戳(在此過程中被移動或復制時改變),每個歸檔的SHA值將改變。 SHA校驗和值用於驗證下載的存檔,因此需要匹配7zip的SHA值。 由於SHA值存儲在Updates.xml文件中,因此將強制您上傳完整存儲庫。 這可以通過使用repogen的--update選項來規避。
創建部分更新 Creating Partial Updates
在重新創建聯機存儲庫時,請使用--update參數。 它將現有存儲庫作為輸入,並僅更改附加參數指定的組件。 那些SHA值在全局配置中也被改變。
上傳部分更新 Uploading Partial Updates
上傳下列項目到Web服務器:
- 組件目錄(通常類似於com.vendor.product.updatedpart)。
- 全局Updates.xml存儲在聯機存儲庫的根目錄中。
注意: 上傳項目的順序非常重要。 如果在實時服務器上更新存儲庫,請首先更新組件,然后更新Updates.xml。 軟件包名稱包括版本號,因此,在新軟件包完全上傳前,最終用戶會收到舊軟件包。
更改存儲庫 Changing Repositories
要使當前更新存儲庫指向其他存儲庫,請編輯當前存儲庫中的Updates.xml文件。 您可以添加,替換或刪除存儲庫。
<RepositoryUpdate>
<Repository action="..." OPTIONS />
<Repository action="..." OPTIONS />
</RepositoryUpdate>
添加存儲庫 Adding Repositories
要更新(原文是Update,猜測應該是添加)存儲庫,請將 具有以下選項 <Repository>子元素添加到<RepositoryUpdate>元素中:
<Repository action="add" url="http://www.example.com/repository" name="user" password="password"
displayname="Example Repository" />
刪除存儲庫 Removing Repositories
要刪除存儲庫,請將 具有以下選項 <Repository>子元素添加到<RepositoryUpdate>元素中:
<Repository action="remove" url="http://www.example.com/repository" />
替換存儲庫 Replacing Repositories
要用一個存儲庫替換另一個,請將 具有以下選項 <Repository>子元素添加到<RepositoryUpdate>元素中:
<Repository action="replace" oldurl="http://www.example.com/repository"
newurl="http://www.example.com/newrepository" name="user" password="password"
displayname="New Example Repository" />
自定義安裝程序 Customizing Installers
您可以使用腳本通過以下方式自定義安裝程序:
- 添加由腳本編譯的Qt Installer Framework 操作,並由安裝程序來執行。
- 在
package.xml文件中指定添加的新頁面,並存放到package目錄中。 - 通過修改現有頁面,將自定義的用戶界面元素作為單個widgets小部件插入其中。
- 添加語言(variants)
您可以使用組件腳本(component scripts)和控制腳本(control script)來自定義安裝程序。組件腳本在組件的package.xml文件的<Script>元素中指定,與特定組件相關聯。在 獲取組件的元數據時加載腳本 。有關組件腳本的更多信息,請參閱組件腳本Controller Scripting。
有關可在組件和控制腳本中使用的全局JavaScript對象的更多信息,請參閱Scripting API。
添加操作 Adding Operations
您可以使用組件腳本在安裝過程中執行Qt Installer Framework操作。 通常,通過移動,復制或修補來操作文件。 使用QInstaller::Component::addOperation或QInstaller::Component::addElevatedOperation函數添加操作。 有關更多信息,請參閱向組件添加操作 Adding Operations to Components。
此外,您可以通過派生KDUpdater::UpdateOperation來實現在安裝程序中注冊自定義安裝操作的方法。 有關詳細信息,請參閱注冊自定義操作 Registering Custom Operations。
有關可用操作的信息,請參閱操作Operations。
添加頁面 Adding Pages
組件可以包含一個或多個用戶界面文件,這些文件由組件或控制腳本放置到安裝程序中(在安裝程序執行時加載)。 安裝程序將自動加載package.xml文件的UserInterfaces元素中列出的所有用戶界面文件。
使用組件腳本添加頁面 Using Component Scripts to Add Pages
要向安裝程序添加新頁面,請使用installer::addWizardPage()方法並指定新頁面的位置。 例如,以下代碼在 准備安裝頁面 之前添加了一個MyPage的實例:
installer.addWizardPage( component, "MyPage", QInstaller.ReadyForInstallation );
您可以使用組件腳本通過調用component::userInterface()方法訪問加載的小部件的類名,如下面的代碼段所示:
component.userInterface( "MyPage" ).checkbox.checked = true;
使用控制腳本添加頁面 Using Control Scripts to Add Pages
要注冊自定義頁面,請使用installer::addWizardPage()方法和U並文件中設置的對象名稱(例如“MyPage”)。 然后調用Dynamic${ObjectName}Callback()函數(例如,DynamicMyPageCallback()):
function Controller()
{
installer.addWizardPage(component, "MyPage", QInstaller.TargetDirectory)
}
Controller.prototype.DynamicMyPageCallback()
{
var page = gui.pageWidgetByObjectName("DynamicMyPage");
page.myButton.click,
page.myWidget.subWidget.setText("hello")
}
您可以通過使用在UI文件中設置的對象名稱來訪問窗口小部件。 例如,在上面的代碼中myButton和myWidget就是控件對象名稱。
添加小部件 Adding Widgets
您可以使用組件或控制腳本將自定義用戶界面元素作為單個窗口小部件(例如復選框)插入到安裝程序中。
要插入單個窗口小部件,請使用installer::addWizardPageItem方法。 例如,以下代碼片段從腳本中將MyWidget的實例添加到 組件選擇頁面 :
installer.addWizardPageItem( component, "MyWidget", QInstaller.ComponentSelection );
與安裝程序功能交互
例如,您可以使用控制腳本在測試中自動執行安裝程序功能。 以下代碼段說明如何自動單擊目標目錄選擇頁上的 下一步(Next) 按鈕:
Controller.prototype.TargetDirectoryPageCallback = function()
{
gui.clickButton(buttons.NextButton);
}
翻譯頁面 Translating Pages
安裝程序使用Qt Translation系統支持將用戶可讀輸出轉換為多種語言。 要向最終用戶提供組件腳本和用戶界面中包含的字符串的 本地化版本 ,請創建隨組件一起加載的QTranslator文件。 安裝程序加載與當前系統區域設置匹配的翻譯文件。 例如,如果系統語言環境是德語,則會加載de.qm文件。 此外,如果找到,將顯示本地化license_de.txt而不是默認的license.txt。
需要將翻譯添加到激活組件的package.xml文件中:
<Translations>
<Translation>de.qm</Translation>
</Translations>
對腳本中的文本文本使用qsTr()函數。 此外,您可以將Component.prototype.retranslateUi方法添加到腳本。 當安裝程序的語言更改並加載翻譯文件時調用。
當在翻譯用戶界面時使用qsTr或UI文件的類名,用於翻譯的上下文是腳本文件的基本名稱。例如,如果腳本文件被稱為installscript.qs,上下文將是installscript。
注意:翻譯系統也可用於自定義UI。 使用例如一個en.ts文件作為自定義英語版本替換安裝程序中的任何文本。
