Qt IFW是Qt官方提供的打包工具。
下载地址:http://download.qt.io/official_releases/qt-installer-framework
官方文档:https://doc.qt.io/qtinstallerframework/index.html
一、打包Windows程序
安装后将bin目录添加到环境变量。
建立如下的目录结构,将要打包的所有文件复制到 data 文件夹中。
config.xml
在config文件夹中建一个config.xml文件。内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Installer>
<Name>Hello World</Name>
<Version>1.0.0</Version>
<Publisher>张三</Publisher>
<StartMenuDir>hello</StartMenuDir>
<TargetDir>C:\Program Files\Hello World</TargetDir>
</Installer>
配置文件的配置元素如下:
- Name:软件名称。必填项。
- Version:软件版本。格式如下:[0-9]+((\.|-)[0-9]+)*。如 1-1、1.2-2、3.4.7。必填项。
- Title:标题栏上显示的软件名称。
- Publisher:软件发布者(如在 Windows 控制面板中所示)。
- ProductUrl:指向包含网站上产品信息的页面的 URL。
- InstallerApplicationIcon:自定义安装程序图标的文件名称。文件格式:“*.icns”(macOS)、“*.ico”(Windows)。在 Unix 上没有此功能。
- InstallerWindowIcon:安装程序的自定义窗口图标的文件名(png格式)。
- Logo:用作 QWizard::LogoPixmap 的徽标的徽标文件名。
- Watermark:用作 QWizard::WatermarkPixmap 的水印的水印文件名。如果 WizardShowPageList 设置为 true,则隐藏水印。
- Banner:用作 QWizard::BannerPixmap 的横幅图像的横幅文件名(仅用于 ModernStyle)。
- Background:用作 QWizard::BackgroundPixmap 的图像的背景文件名(仅由 MacStyle 使用)。 如果 WizardShowPageList 设置为 true,则隐藏背景。
- PageListPixmap:安装程序页面列表顶部显示的图像的文件名。仅当 WizardShowPageList也设置为 true 时才显示图像。
- WizardStyle:设置要使用的向导样式(“Modern”、“Mac”、“Aero”、“Classic”)。
- StyleSheet:设置样式表文件。
- WizardDefaultWidth、WizardDefaultHeight:以像素为单位设置向导的默认宽度、高度。设置 Banner 将覆盖此设置。可以将 em 或 ex 后缀添加到指定值以使用 em 或 ex 单位,就像在 CSS 文件中一样。
- WizardMinimumWidth、WizardMinimumHeight:以像素为单位设置向导的最小宽度、高度。可以将 em 或 ex 后缀添加到指定值以使用 em 或 ex 单位,就像在 CSS 文件中一样。
- WizardShowPageList:如果不需要显示向导左侧的小部件列表安装程序页面,则设置为 false。默认为true。
- ProductImages:要在 PerformInstallationPage 上显示的图像列表。该元素可以有一个或多个包含图像文件名的 <Image> 子元素。
- TitleColor:设置标题和副标题的颜色(采用 HTML 颜色代码,例如“#88FF33”)。
- RunProgram:如果用户接受操作,则在安装程序完成后执行的命令。
- RunProgramArguments:传递给 RunProgram 中指定的程序的参数。可以添加多个 <Argument> 子元素,每个子元素都为 RunProgram 指定一个参数。
- RunProgramDescription:显示在安装后运行程序的复选框旁边的文本。如果设置了 RunProgram 但未提供说明,则 UI 现在将显示 Run <Name>。
- StartMenuDir:Windows 开始菜单中产品的默认程序组的名称。
- TargetDir:用于安装的默认目标目录。
- AdminTargetDir:具有管理员权限的默认安装目标目录。仅在 Linux 上可用。
- RemoteRepositories:远程存储库列表。此元素可以包含多个 <Repository> 子元素,每个子元素都包含指定用于访问存储库的 URL 的 <Url> 子元素。
- RepositoryCategories:可以包含 RemoteRepositories 子元素列表的类别名称。
- MaintenanceToolName:生成的维护工具的文件名。默认为“maintenancetool”。
- MaintenanceToolIniFile:生成的维护工具配置的文件名。默认为 “MaintenanceToolName.ini”。
- RemoveTargetDir:如果卸载时不应删除目标目录,则设置为 false。
- AllowNonAsciiCharacters:如果安装路径可以包含非 ASCII 字符,则设置为 true。
- DisableAuthorizationFallback:如果安装不应该要求用户在授权错误的情况下运行授权回退,则设置为 true。
- DisableCommandLineInterface:如果应禁用命令行界面功能,则设置为 true。这预阻止用户将任何命令传递给安装程序,例如安装、更新和删除。其他选项仍然可以正常使用。默认为false。
- RepositorySettingsPageVisible:设置为 false 以隐藏设置对话框内的存储库设置页面。
- AllowSpaceInPath:如果安装路径不能包含空格字符,则设置为 false。
- DependsOnLocalInstallerBinary:如果要禁止从外部资源(例如网络驱动器)进行安装,则设置为 true。该选项仅用于 Windows。
- TargetConfigurationFile:目标上的配置文件的文件名。默认为 components.xml。
- Translations:用于翻译用户界面的翻译文件列表。要添加多个翻译文件,请指定多个 <Translation> 子元素,每个子元素都指定翻译的名称。可选的。
- UrlQueryString:此字符串需要采用“key=value”形式,并将附加到存档下载请求中。这可用于将信息传输到托管存储库的网络服务器。
- ControlScript:自定义安装程序控制脚本的文件名。
- CreateLocalRepository:如果要在安装目录中创建本地存储库,请设置为 true。此选项对在线安装程序没有影响。该存储库将自动添加到默认存储库列表中。
- InstallActionColumnVisible:如果想在组件树中添加一个额外的列来显示安装操作,则设置为 true。这个额外的列指示组件是要安装还是卸载,或者只是保持安装或卸载。
- SupportsModify:如果产品不支持修改现有安装,则设置为 false。
- SaveDefaultRepositories:如果默认存储库 RemoteRepositories 不应保存到 MaintenanceToolName.ini,则设置为 false。默认情况下保存默认存储库。不保存存储库意味着当运行维护工具时,没有使用默认存储库。
- AllowUnstableComponents:如果允许安装其他组件,尽管存在不稳定的组件,则设置为 true。如果组件缺少依赖项、脚本中有错误等,则该组件不稳定。不稳定的组件在组件树中显示为灰色,因此无法选择。默认情况该值为 false,这意味着如果发现不稳定的组件将中止安装。
可以使用预定义的变量(嵌入在 @ 字符中)作为元素的值。预定义变量:
- ProductName:要安装的产品的名称,如 config.xml 中所定义。
- ProductVersion:要安装的产品的版本号,在 config.xml 中定义。
- Title:安装程序的标题,在 config.xml 中定义。
- Publisher:安装程序的发布者,在 config.xml 中定义。
- Url:产品 URL,在 config.xml 中定义。
- StartMenuDir:开始菜单组,在 config.xml 中定义。仅在 Windows 上可用。
- TargetDir:用于安装的目标目录,由用户选择。
- DesktopDir:包含用户桌面的目录的名称。仅在 Windows 上可用。
- os:当前平台:“x11”、“win”、“mac”等。
- FrameworkVersion:用于构建安装程序的 Qt 安装程序框架的版本号。
- RootDir:文件系统的根目录。
- HomeDir:当前用户的主目录。
- ApplicationsDir:应用程序目录。例如,Windows 上的 C:\Program Files、Linux 上的 /opt 、macOS 上的 /Applications。
- ApplicationsDirUser:用户特定程序的应用程序目录。这在 macOS 上有用,在其他平台上它与 ApplicationsDir 相同。例如,macOS 上的 $HOME/Applications。
- ApplicationsDirX86:32 位程序的应用程序目录。这在 Windows 上有用,在其他平台上它与 ApplicationsDir 相同。例如,Windows 上的 C:\Program Files (x86)。
- ApplicationsDirX64:64 位程序的应用程序目录。这在 Windows 上很有用,在其他平台上它与 ApplicationsDir 相同。例如,Windows 上的 C:\Program Files。
- InstallerDirPath:安装程序应用程序可执行文件的目录。
- InstallerFilePath:安装程序应用程序可执行文件的文件路径。
- UserStartMenuProgramsPath:用户开始菜单中项目的文件夹的路径。例如:C:\Users\USERNAME\AppData\Roaming\Microsoft\Windows\Start Menu\Programs。仅在 Windows 上可用。
- AllUsersStartMenuProgramsPath:包含所有用户开始菜单中项目的文件夹的路径。例如:C:\ProgramData\Microsoft\Windows\Start Menu\Programs。仅在 Windows 上可用。
package.xml
packages文件夹可以放多个组件(package)。
在meta文件夹中创建一个package.xml文件。此文件描述的是 com.helloWorld 这个组件的信息。文件内容如下:
<?xml version="1.0"?>
<Package>
<DisplayName>hello World 组件</DisplayName>
<Description>测试程序</Description>
<Version>1.0.0</Version>
<ReleaseDate>1949-10-01</ReleaseDate>
<Name>com.helloworld</Name>
<Script>installscript.qs</Script>
</Package>
此文件可用的元素信息:
- DisplayName:组件的名称。必填项。
- Description:组件的描述。必填项。
- Version:组件的版本号,格式如下:[0-9]+((\.|-)[0-9]+)*。如1-1、1.2-2、3.4.7。必填项。
- ReleaseDate:组件版本的发布日期。必填项。
- Name:组件的域标识。必填项。
- Dependencies:组件所依赖的组件标识符的列表。逗号或短线分隔。
- AutoDependOn:组件自动依赖的组件标识符列表。当且仅当满足所有指定的依赖项时才安装该组件。如果组件自动依赖于其他组件,则组件树中该组件旁边的复选框将不可见。选择将自动执行。如果之前未安装该组件,则仅当同时选择安装此列表中的所有组件时,才会选择安装该组件。如果该组件已安装,则当该列表中的至少一个组件也被选中进行卸载时,将选择该组件进行卸载。
- Virtual:设置为 true 以隐藏安装程序中的组件。请注意,在根组件上设置此项不起作用。
- SortingPriority:组件在树中的优先级。树从最高优先级到最低优先级排序,最高优先级在顶部。
- Licenses:安装用户接受的许可协议列表。要添加多个许可证,请添加多个 <License> 子元素,每个子元素指定许可证名称和文件以及优先级(可选)。
如果列出了此组件的翻译,安装程序还将查找翻译的许可证。这些文件需要与原始许可证文件具有相同的名称,但需要添加区域设置标识符。例如,如果许可证文件名为 license.txt 并且指定了汉语翻译,则安装程序还将包含 license_cn_cn.txt 文件(并在汉语系统上安装时显示该文件)。 - Script:正在加载的脚本的文件名。
- UserInterfaces:要加载的页面列表。要添加多个页面,请添加多个 <UserInterface> 子元素,每个子元素指定一个页面的文件名。
- Translations:要加载的翻译文件列表。要添加多种语言,请指定多个 <Translation> 子元素,每个子元素指定一个语言变体的文件名。
- UpdateText:更新文本。如果是对组件的更新,则将更新文本描述添加到组件描述中。
- Essential:如果有可用于基本组件的更新,则包管理器将保持禁用状态,直到该组件更新,然后强制重启 MaintenanceTool 。 运行更新程序时会自动安装新引入的基本组件。
- ForcedInstallation:确定必须始终安装包。最终用户无法在安装程序中取消选择它。
- ForcedUpdate:如果对于当前组件有可用的更新,包管理器保持禁用状态,强制重新启动 MaintenanceTool,直到该组件被更新。
- Replaces:逗号分隔的要替换的组件列表。
- DownloadableArchives:列出供在线安装程序下载的数据文件(以逗号分隔)。如果组件中有一些数据并且 package.xml 和/或脚本没有 DownloadableArchives 值,repogen 工具会自动注册找到的数据。
- RequiresAdminRights:如果需要使用提升的权限安装包,则设置为 true。
- Checkable:如果要隐藏项目的复选框,则设置为 false。
- ExpandedByDefault:如果希望默认展开此项,则设置为 true。
- Operations:安装组件时执行的操作列表。要添加多个操作,请指定多个 <Operation> 子元素,每个子元素都指定操作名称。根据要运行的操作,操作可以有多个 <Argument> 子元素。添加 <Operations> 是在脚本中定义操作的另一种定义方法。
- TreeName:指定安装树视图中的组件位置,覆盖根据组件名称计算的原始位置。
installscript.qs
在meta文件夹创建一个 installscript.qs 文件即 package.xml 中指定的脚本名称,用作配置将程序添加到开始菜单的相关设置。内容如下:
function Component()
{
}
Component.prototype.createOperations = function()
{
component.createOperations();
if (systemInfo.productType === "windows")
{
//开始菜单快捷方式
component.addOperation("CreateShortcut", // 创建快捷方式
"@TargetDir@/helloWorld.exe", // 默认安装目录/helloWorld.exe
"@StartMenuDir@/helloWorld.lnk", //开始菜单
"workingDirectory=@TargetDir@");
//桌面快捷方式
component.addOperation("CreateShortcut",
"@TargetDir@/helloWorld.exe",
"@DesktopDir@/helloWorld.lnk",
"workingDirectory=@TargetDir@");
}
}
然后是打包,进入helloWorld_Release目录,执行:
binarycreator -c config\config.xml -p packages helloworld.exe -v
打包成功:
开始菜单和桌面成功创建快捷方式。
二、打包Linux程序
在Linux用IFW打包程序基本上和在Windows上打包过程一致,不过创建快捷键不一样。在Windows上面创建快捷方式用到了TargetDir、StartMenuDir这两个变量在Linux是无效的,且系统中桌面文件夹的路径是中文的“桌面”。
参考了这两篇文章:
Qt installer framework 在 linux生成桌面图标
installscript.qs文件内容:
function Component()
{
}
function operationForLinux()
{
var params = "Name=UiControl" + "\n";
params += "Icon=@TargetDir@/uiIcon.png" + "\n";
params += "Version=@Version@" + "\n";
params += "Exec=@TargetDir@/UiControl" + "\n";
params += "Terminal=false" + "\n";
params += "Encoding=UTF-8" + "\n";
params += "Type=Application" + "\n";
params += "Categories=Network" + "\n";
var desktop = "UiControl.desktop";
component.addOperation("CreateDesktopEntry", desktop, params);
var homeDir = installer.environmentVariable("HOME");
if(homeDir.length > 0)
{
var XDG_DATA_HOME = installer.environmentVariable("XDG_DATA_HOME");//获取XDG_DATA_HOME环境变量
if(XDG_DATA_HOME.length > 0)
{
var XDG_DESKTOP_DIR = installer.environmentVariable("XDG_DESKTOP_DIR");
component.addOperation("Copy", XDG_DATA_HOME+"/applications/" + desktop, homeDir + XDG_DESKTOP_DIR);
}
}
}
Component.prototype.createOperations = function()
{
component.createOperations();
//if (systemInfo.productType === "linux")
//{
operationForLinux();
//}
}
这里改成从配置文件里面搜索出桌面的名称,不管是中文还是英文都不影响。