在生成软件包之前,您需要了解需要创建哪些文件以及需要执行哪些命令。您还需要考虑您的应用程序软件的要求以及客户的需要。您的客户是将要安装您的软件包的管理员。本章讨论生成软件包之前您应该了解和考虑的文件、命令和准则。
以下是本章中信息的列表。
使用以下任务图可以找到用于生成和验证软件包的逐步说明。
应用程序软件是以被称为软件包的单位交付的。软件包是软件产品所需的文件和目录的集合。软件包通常是在完成应用程序代码开发后由应用程序开发者设计和生成的。软件产品需要生成到一个或多个软件包中,以便可以轻松地将其转换为分发介质。然后,便可以大量生产该软件产品,并由管理员进行安装。
软件包是具有所定义格式的文件和目录的集合。该格式符合应用程序二进制接口 (application binary interface, ABI),ABI 是对系统 V 接口定义的补充。
软件包组件分为两类。
软件包对象是要安装的应用程序文件。
控制文件控制是否安装软件包以及软件包的安装方式和位置。
控制文件又分为两类:信息文件和安装脚本。有些控制文件是必需的,有些控制文件是可选的。
要打包您的应用程序,必须首先创建组成软件包所必需的组件以及任何可选组件。然后,您可以使用 pkgmk 命令来生成软件包。
要生成软件包,您必须提供以下各项:
下图描述了软件包的内容。
软件包对象
这些组件用于组成应用程序。它们可由以下各项组成:
文件(可执行文件或数据文件)
目录
命名管道
链接
设备
pkginfo 文件
pkginfo 文件是必需的软件包信息文件,用于定义参数值。参数值包括软件包缩写、软件包全名和软件包体系结构。有关更多信息,请参见创建 pkginfo 文件和 pkginfo(4) 手册页。
有两个 pkginfo(1) 手册页。第一个手册页介绍了用于显示有关已安装软件包信息的第 1 节中的命令。第二个手册页介绍了用于描述软件包特征的第 4 节中的 文件。访问手册页时,请确保指定适用的手册页节。例如: man -s 4 pkginfo。
prototype 文件
prototype 文件是必需的软件包信息文件,用于列出软件包的组件。每个软件包对象、信息文件和安装脚本都存在一个相应的条目。这类条目由描述各个组件的若干信息字段组成,包括组件的位置、属性和文件类型。有关更多信息,请参见创建 prototype 文件和 prototype(4) 手册页。
您可以在软件包中包含四个可选软件包信息文件:
定义与此版本软件包兼容的以前软件包版本。
指出与您的软件包有特殊关系的其他软件包。
定义目标环境的磁盘空间要求,这会超过 prototype 文件中定义的对象所要求的空间。例如,对于在安装时动态创建的文件,可能需要额外的空间。
定义安装软件包时所显示的版权信息文本。
每个软件包信息文件都应在 prototype 文件中有一个对应条目。关于创建这些文件的更多信息,请参见创建信息文件。
安装脚本并不是必需的。但是,您可以提供可在安装软件包期间执行自定义操作的脚本。安装脚本具有以下特征:
该脚本由 Bourne shell 命令组成。
该脚本的文件权限应设为 0644。
该脚本不需要包含 shell 标识符 (#! /bin/sh)。
request 脚本
checkinstall 脚本
checkinstall 脚本仅在 SolarisTM 2.5 发行版和兼容发行版中可用。
过程脚本定义在软件包安装和删除过程中的特定时刻所发生的操作。您可以使用这些预定义的名称创建四个过程脚本: preinstall、postinstall、preremove 和 postremove。
类操作脚本定义一组要对对象组执行的操作。
有关安装脚本的更多信息,请参见创建安装脚本。
生成软件包之前,您需要确定您的产品将由一个还是多个软件包组成。请注意,许多小软件包会比一个大软件包需要更长的安装时间。虽然创建单个软件包是一个不错的主意,但不一定总能实现。如果您决定生成多个软件包,则需要确定如何对应用程序代码分段。本节提供了计划生成软件包时使用的准则列表。
许多打包准则在彼此之间都存在着一定的折衷。均衡地满足所有要求通常很困难。这些准则是按重要性顺序呈现的。不过,需要根据具体环境将此顺序用作灵活的指导。虽然每个准则都很重要,但终究取决于您来优化这些要求,以生成一组优质的软件包。
有关更多设计理念,请参见第 6 章。
所有软件包必须可远程安装。可远程安装是指要安装软件包的管理员可以尝试将其安装在客户机系统上,而不一定安装到执行 pkgadd 命令的根 (/) 文件系统。
布置软件包时,请考虑不同类型的系统软件配置(例如,独立系统和服务器)。良好的打包设计会分离受影响的文件,以优化每个配置类型的安装。例如,应该将根 (/) 和 /usr 文件系统的内容进行分段,以便可以轻松地支持服务器配置。
软件包应该是一个独立的整体,并且可通过一组功能清楚地标识。例如,一个包含 UFS 的软件包应包含所有 UFS 实用程序,并只限于采用 UFS 二进制代码。
应该根据客户的视角将软件包组织成功能单元。
将因有合同而需要支付版税的代码放到专用软件包或软件包组中。请勿将代码分散放到并非必需的多个软件包中。
将系统相关的二进制代码保存在专用软件包中。例如,应该将内核代码放在专用软件包中,使每个实现体系结构都由不同的软件包实例组成。本规则也适用于不同体系结构的二进制代码。例如,SPARC 系统的二进制代码应放在一个软件包中,而 x86 系统的二进制代码应放在另一个软件包中。
构建软件包时,请尽一切可能消除重复的文件。不必要的文件重复会导致支持和版本方面的困难。如果您的产品有多个软件包,请反复比较这些软件包的内容以查看是否存在重复的文件。
本地化特定的项目应放在其自己的软件包中。理想的软件包模型应根据每种语言环境将产品的本地化项目作为一个软件包交付。遗憾的是,在某些情况下组织边界与功能和产品边界准则相冲突。
国际缺省设置也可以在一个软件包中交付。此设计可以将需要本地化更改的文件隔离开来,并对本地化软件包的交付格式进行标准化。
本文档讨论 SVR4 软件包。如果要交付到 OpenSolaris OS,请考虑使用映像包管理系统 (Image Packaging System, IPS) 软件包。OpenSolaris OS 既支持 SVR4,又支持 IPS 软件包。IPS 软件可与网络系统信息库进行交互,并使用 ZFS 文件系统。在 OpenSolaris OS 中,可以使用 pkgsend(1) 命令将现有的 SVR4 软件包发布到 IPS 系统信息库。
下表对 SVR4 包管理系统和 IPS 包管理系统所使用的命令进行了比较。有关 IPS 的详细信息,请参见 Getting Started With the Image Packaging System(映像包管理系统入门)。
表 1–1 打包任务:IPS 和 SVR4
任务 |
IPS 命令 |
SVR4 命令 |
---|---|---|
安装新软件包 |
pkg install |
pkgadd -a |
显示有关软件包状态的信息 |
pkg list |
pkginfo |
验证软件包安装是否正确 |
pkg verify |
pkgchk -v |
显示有关软件包的信息 |
pkg info |
pkginfo -l |
列出软件包的内容 |
pkg contents |
pkgchk -l |
卸载软件包 |
pkg uninstall |
pkgrm |
本节介绍在处理软件包时可能会用到的命令、文件和脚本。手册页中会对这些内容进行介绍,本书也将对这些内容进行详细介绍,以及其执行的特定任务。
下表显示的命令可帮助您生成、验证、安装软件包并获取有关软件包的信息。
表 1–2 打包命令
任务 |
命令/手册页 |
说明 |
更多信息 |
|
---|---|---|---|---|
创建软件包 |
生成 prototype 文件以作为 pkgmk 命令的输入 | |||
|
创建可安装的软件包 |
|
||
安装、删除和转换软件包 |
将软件包安装到系统中 | |||
|
将答复存储到 request 脚本 |
|
||
|
将软件包复制到分发介质 |
|
||
|
从系统中删除软件包 |
|
||
获取有关软件包的信息 |
验证软件包的完整性 | |||
|
显示软件包信息 |
|
||
|
显示软件包参数值 |
|
||
修改已安装的软件包 |
将新软件包对象并入到已安装的软件包中 | |||
|
从已安装的软件包中删除软件包对象 |
|
表 1–3 软件包信息文件
文件 |
说明 |
更多信息 |
---|---|---|
软件包安装缺省文件 | ||
软件包兼容性文件 | ||
软件包版权信息文件 | ||
软件包相关性文件 | ||
软件包特征文件 | ||
软件包内容说明文件 | ||
软件包信息文件 | ||
软件包磁盘空间要求文件 |
下表介绍了一些可选安装脚本,您可以编写这样的脚本以影响是否以及如何安装软件包。
表 1–4 软件包安装脚本
脚本 |
说明 |
更多信息 |
---|---|---|
request |
请求来自安装人员的信息 | |
checkinstall |
收集文件系统数据 | |
preinstall |
在安装类之前执行任何自定义安装要求 | |
postinstall |
在安装所有卷之后执行任何自定义安装要求 | |
preremove |
在删除类之前执行任何自定义删除要求 | |
postremove |
在删除所有类之后执行任何自定义删除要求 | |
类操作 |
对特定对象组执行一系列操作。 |