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:设置样式表文件。
  • WizardDefaultWidthWizardDefaultHeight:以像素为单位设置向导的默认宽度、高度。设置 Banner 将覆盖此设置。可以将 em 或 ex 后缀添加到指定值以使用 em 或 ex 单位,就像在 CSS 文件中一样。
  • WizardMinimumWidthWizardMinimumHeight:以像素为单位设置向导的最小宽度、高度。可以将 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上面创建快捷方式用到了TargetDirStartMenuDir这两个变量在Linux是无效的,且系统中桌面文件夹的路径是中文的“桌面”。

参考了这两篇文章:

Qt installer framework 在 linux生成桌面图标 

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();
    //}
}

这里改成从配置文件里面搜索出桌面的名称,不管是中文还是英文都不影响。

Logo

更多推荐