一、引言
对于QtIFW进行多组件安装包的制作,需要编写安装脚本,故需要知道如何编写安装脚本以及一些语法参数。详见《QtIFW 安装脚本与语法》
本文主题:如何创建多组件的安装包
二、详细过程记录
(2-1)多组件的目录层级和依赖关系
对于多组件的安装包,其package目录下将会出现如下的目录层级结构:
-packages
- com.vendor.root //根组件
- data
- meta
- com.vendor.root.component1 //依赖于根组件的component1组件
- data
- meta
- com.vendor.root.component1.subcomponent1 //依赖于component1组件的subcomponent1组件
- data
- meta
- com.vendor.root.component2 //依赖于根组件的component2组件
- data
- meta
组件可以依赖于一个或多个实组件或虚组件。依赖项是通过使用组件标识符和(可选)组件版本来定义的。使用破折号(-)分隔版本号和标识符。
可以用比较操作符(=,>,<(<), >=或<=(<=))来指示包的版本号与所需的版本号进行比较,并且必须等于、大于、小于、大于或等于或小于依赖项中指定的版本号。如果没有给出比较操作符,则默认为=。
(2-2)描述组件的package.xml文件的编写
一个示例:
<?xml version="1.0"?>
<Package>
<DisplayName>QtGui</DisplayName>
<Description>Qt gui libraries</Description>
<Description xml:lang="de_de">Qt GUI Bibliotheken</Description>
<Version>1.2.3</Version>
<ReleaseDate>2009-04-23</ReleaseDate>
<Name>com.vendor.root.component2</Name>
<Dependencies>com.vendor.root.component1</Dependencies>
<Virtual>false</Virtual>
<Licenses>
<License name="License Agreement" file="license.txt" />
</Licenses>
<Script>installscript.qs</Script>
<UserInterfaces>
<UserInterface>specialpage.ui</UserInterface>
<UserInterface>errorpage.ui</UserInterface>
</UserInterfaces>
<Translations>
<Translation>sv_se.qm</Translation>
<Translation>de_de.qm</Translation>
</Translations>
<DownloadableArchives>component2.7z, component2a.7z</DownloadableArchives>
<AutoDependOn>com.vendor.root.component3</AutoDependOn>
<SortingPriority>123</SortingPriority>
<UpdateText>This changed compared to the last release</UpdateText>
<Default>false</Default>
<ForcedInstallation>false</ForcedInstallation>
<Essential>false</Essential>
<Replaces>com.vendor.root.component2old</Replaces>
</Package>
xml文件元素表:
Element | 描述 |
---|---|
DisplayName | 可读的组件名称。将xml:lang属性设置为正确的区域设置,将组件名称的翻译作为附加DisplayName标记的值指定。【必需的】 |
Description | 对组件的可读描述。必需的。翻译可以类似于DisplayName标签指定。如果没有找到与区域设置匹配的本地化,并且存在未翻译的版本,则将使用该版本。否则将不会显示该区域设置的Description。用户可点击的外部链接,例如组件的主页,可以通过指定URL地址包括在组件描述中:{external-link}=‘https://www.qt.io/’。URL必须是有效的,并且包含所需资源的完整路径。 |
Version | 组件的版本号,格式如下:[0-9]+((. |
ReleaseDate | 该组件版本发布的日期。【必需的】 |
Name | 此组件的类域标识。【必需的】 |
Dependencies | 该组件所依赖的组件标识符的逗号分隔列表。还可以指定版本号,用破折号(-)分隔。你可以用比较操作符(=,>,<,>=或<=)作为版本号的前缀。记住,必须使用字符引用“<”来转义左尖括号(使用“<”而不是“<”和“<=”而不是“<=”)。 |
AutoDependOn | 此组件具有自动依赖关系的组件的标识符的逗号分隔列表。当且仅当满足所有指定的依赖项时,才安装组件。如果组件自动依赖于其他组件,则在组件树中的组件旁边将不可见复选框。选择将自动执行。如果该组件之前没有安装过,则只有当此列表中的所有组件也被选择安装时,才会选择该组件进行安装。如果组件已经安装,它将被选择。 |
Virtual | 设置为true将组件从安装程序中隐藏。注意,在根组件上设置此参数是不起作用的。 |
SortingPriority | 树中组件的优先级。树的优先级从最高到最低,最高优先级在顶端。 |
Licenses | 安装用户接受的许可协议列表。要添加几个许可证,请添加几个子元素,每个子元素指定许可证名称和文件。license文件支持ASCII和UTF8两种文件格式。如果该组件列出了翻译,安装程序也将查找翻译许可证。这些文件需要与原始许可文件具有相同的名称,但需要添加地区标识符。 |
Script | 正在加载的脚本的文件名。可选的 |
UserInterfaces | 要加载的页面列表。要添加多个页面,请添加几个子元素,每个子元素指定页面的文件名。可选的 |
Translations | 要加载的翻译文件列表。要添加几个语言变体,请指定几个子元素,每个子元素指定一个语言变体的文件名。可选的。 |
UpdateText | 如果这是对组件的更新,则添加到组件描述中的描述。可选的。 |
Default | 取值为:true、false和script。设置为true可以在安装程序中预先选择组件。这只在没有可见子组件的组件上生效。布尔值直接计算,而脚本在运行时解析。在这个文件中添加脚本的名称作为< script >元素的值。 |
Essential | 将包标记为强制重新启动维护工具所必需的。如果一个重要组件有更新可用,那么包管理器将保持禁用状态,直到该组件被更新。在运行更新程序时,会自动安装新引入的基本组件。 |
ForcedInstallation | 确定必须始终安装该包。终端用户不能在安装程序中取消选择它。 |
Replaces | 要替换的组件的逗号分隔列表。可选的。 |
DownloadableArchives | 列出要下载的在线安装程序的数据文件(用逗号分隔)。如果组件内部有一些数据,而package.xml和/或脚本没有DownloadableArchives值,repogen工具会自动注册找到的数据。 |
RequiresAdminRights | 如果软件包需要以更高的权限安装,则设置为true。可选的。 |
Checkable | 如果要隐藏项目的复选框,请设置为false。当只需要选择几个子组件而不是全部时,这是非常有用的。可选的。 |
ExpandedByDefault | 如果希望此项在默认情况下展开,则将其设置为true。可选的。 |
(2-3)创建多组件安装包的一个示例
经过前面的内容,对package.xml组件包描述文件有了一定了解。总结一下:
1、每个组件包下的meta目录都必须放置一个package.xml用于描述该组件包。
2、packages目录下为放置的组件包。该组件包目录的名称与组件包的依赖有关系。如果目录名称与package.xml描述的依赖关系不一致时,安装时将会出现错误。
【具体步骤】
1、在packages目录创建如下目录,并指定组件之间的依赖关系:
在上图中,component为根组件,其他的组件都依赖于该组件。
在package.xml文件使用<Dependencies>来执行该组件包的依赖性。如下为component.1.subComponent的package.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>component.1.subComponet</DisplayName>
<Description>This is component.1.subComponet</Description>
<Version>1.0.0-1</Version>
<ReleaseDate>2021-11-07</ReleaseDate>
<Default>true</Default>
<Dependencies>component.1</Dependencies>
<Script>installscript.qs</Script>
</Package>
依次完成各个组件包中package.xml文件中参数设置与依赖关系的设置。
三、生成安装包,运行效果