应用程序包开发者指南

第 2 章 生成软件包

本章介绍生成软件包涉及的过程和任务。其中一些任务是必需的,一些任务是可选的。必需的任务会在本章中进行详细讨论。有关可选任务(可用于为软件包添加更多功能)的信息,请参见第 3 章第 6 章

以下是本章中信息的列表。

软件包生成过程(任务图)

表 2–1 描述了生成软件包时所需遵循的过程,特别是如果您没有丰富的软件包生成经验时更应该遵循该过程。虽然您不必完全按照前四个任务的列出顺序来完成这些任务,但是如果遵循此顺序,您将可以更轻松地体验软件包的生成过程。一旦您成为经验丰富的软件包设计员,就可以根据您的需要重排这些任务的顺序。

作为一位经验丰富的软件包设计员,您可以使用 make 命令和 makefile 来自动化软件包生成过程。有关更多信息,请参见 make(1S) 手册页。

表 2–1 软件包生成过程任务图

任务 

说明 

参考 

1. 创建一个 pkginfo 文件

创建 pkginfo 文件以描述软件包的特征。

如何创建 pkginfo 文件

2. 组织软件包内容 

将软件包组件安排为分层目录结构。 

组织软件包的内容

3. (可选)创建信息文件 

定义软件包相关性,提供版权信息,并在目标系统上保留额外空间。 

第 3 章

4. (可选)创建安装脚本 

定制软件包的安装和删除过程。 

第 3 章

5. 创建一个 prototype 文件

prototype 文件中描述软件包中的对象。

创建 prototype 文件

6. 生成软件包 

使用 pkgmk 命令生成软件包。

生成软件包

7. 验证并转换软件包 

在将软件包复制到分发介质之前验证其完整性。 

第 4 章

软件包环境变量

您可以使用必需的信息文件 pkginfoprototype 中的变量。也可以使用 pkgmk 命令的选项,该命令用于生成软件包。随着本章对这些文件和命令的讨论,将会提供更多有关这些变量的上下文相关信息。不过,在开始生成软件包之前,您应该了解不同类型的变量,以及它们如何影响软件包的成功创建。

变量可以分为两种类型:

关于使用环境变量的一般规则

pkginfo 文件中,变量定义采用 PARAM=value 形式,其中,PARAM 的首字母是大写字母。仅在安装时对这些变量进行计算。如果这些变量中的任一个不能被计算,则 pkgadd 命令将出错而异常中止。

prototype 文件中,变量定义可采用 !PARAM=value$ variable 形式。PARAMvariable 均可以一个大写或小写字母开头。只有在生成时值已知的变量才会被计算。如果 PARAMvariable 是在生成时值未知的生成变量或安装变量,则 pkgmk 命令将出错而异常中止。

您还可以将 PARAM=value 选项用作 pkgmk 命令的选项。此选项的作用与在 prototype 文件中基本相同,只不过其作用域是全局的,适用于整个软件包。 prototype 文件中的 !PARAM=value 定义是局部的,仅适用于该文件及其所定义的软件包组成部分。

如果 PARAM 是安装变量,而 variable 是值已知的安装变量或生成变量,则 pkgmk 命令会将定义插入到 pkginfo 文件中,以便该定义在安装时可用。但是,pkgmk 命令不会计算在 prototype 文件中指定的任何路径名中的 PARAM 变量。

软件包环境变量汇总

下表汇总了变量的规范格式、位置和作用域。

表 2–2 软件包环境变量汇总

变量的定义位置 

变量定义格式 

定义的变量类型 

变量计算时间 

变量计算位置 

变量可以替换的项目 

pkginfo 文件

PARAM=value

生成 

在生成时忽略 

N/A 

无 

   

安装 

安装时 

pkgmap 文件中

ownergrouppath 或链接目标

prototype 文件

!PARAM=value

生成 

生成时 

prototype 文件和任何内含的文件中

modeownergrouppath

   

安装 

生成时 

prototype 文件和任何内含的文件中

!search!command 命令

pkgmk 命令行

PARAM=value

生成 

生成时 

prototype 文件中

modeownergrouppath

   

安装 

生成时 

prototype 文件中

!search 命令

     

安装时 

pkgmap 文件中

ownergrouppath 或链接目标

创建 pkginfo 文件

pkginfo 文件是一种 ASCII 文件,用于描述软件包的特征以及帮助控制安装流程的信息。

pkginfo 文件中的每个条目均占一行,使用 PARAM=value 格式设定参数值。PARAM 可以是在 pkginfo(4) 手册页中描述的任一个标准参数。对于参数的指定顺序没有确定要求。


注 –

每个 value 可以由单引号或双引号括起(例如,'value' 或 "value")。如果 value 包含任何对 shell 环境而言被视为特殊字符的字符,您应该使用引号。本书中的示例和案例分析不使用引号。请参见 pkginfo(4) 手册页,了解使用双引号的示例。


您还可以通过在 pkginfo 文件中为软件包参数赋值,创建您自己的软件包参数。您的参数必须以大写字母开头,后跟大写或小写字母。大写字母表明参数(变量)将在安装时(与生成时相对)被计算。有关安装变量与生成变量之间区别的信息,请参见软件包环境变量


注 –

任何参数值之后的结尾空格都会被忽略。


您必须在 pkginfo 文件中定义以下五个参数: PKGNAMEARCH VERSIONCATEGORY。当生成软件包时,软件会自动插入 PATHPKGINST INSTDATE 参数。不要修改这八个参数。有关其余参数的信息,请参见 pkginfo(4) 手册页。

定义软件包实例

同一个软件包可以有不同的版本,可以与不同的体系结构兼容,或者同时符合这两种情况。软件包的每个变体称为一个软件包实例。软件包实例通过组合 pkginfo 文件中的 PKGARCHVERSION 参数定义来确定。

pkgadd 命令可在安装时为每个软件包实例指定一个软件包标识符。软件包标识符是软件包缩写后跟一个数字后缀,例如 SUNWadm.2。此标识符可区分不同软件包的实例,还可区分同一个软件包的不同实例。

定义软件包缩写 (PKG)

软件包缩写是软件包的简短名称,由 pkginfo 文件中的 PKG 参数定义。软件包缩写必须具有以下特征:

指定软件包体系结构 (ARCH)

pkginfo 文件中的 ARCH 参数标识与软件包相关联的体系结构。体系结构名称的最大长度为 16 个字母数字字符。如果一个软件包与多个体系结构相关联,请以逗号分隔的列表形式指定这些体系结构。

以下是 pkginfo 文件中一个软件包体系结构规范的示例:


ARCH=sparc

指定软件包指令集体系结构 (SUNW_ISA)

pkginfo 文件中的 SUNW_ISA 参数标识与 Sun Microsystems 软件包相关联的指令集体系结构。值如下所示:

例如,在 pkginfo 文件中,一个包含 64 位对象的软件包的 SUNW_ISA 值是:


SUNW_ISA=sparcv9

如果没有设置 SUNW_ISA,则软件包的缺省指令集体系结构会设置为 ARCH 参数的值。

指定软件包版本 (VERSION)

pkginfo 文件中的 VERSION 参数标识软件包的版本。版本的最大长度为 256 个 ASCII 字符,且不能以左括号开头。

以下是 pkginfo 文件中的一个版本规范示例:


VERSION=release 1.0

定义软件包名称 (NAME)

软件包名称是软件包的全名,由 pkginfo 文件中的 NAME 参数定义。

由于系统管理员通常会根据软件包名称确定是否需要安装该软件包,因此使用清晰、简明且完整的软件包名称是很重要的。软件包名称必须满足以下条件:

以下是 pkginfo 文件中定义的软件包名称示例:


NAME=Chip designers need CAD application software to design
abc chips.  Runs only on xyz hardware and is installed in the
usr partition.

定义软件包类别 (CATEGORY)

pkginfo 文件中的 CATEGORY 参数指定软件包所属的类别。一个软件包至少必须属于 systemapplication 类别。类别名称由字母数字字符组成。类别名称的最大长度为 16 个字符,且不区分大小写。

如果一个软件包属于多个类别,请以逗号分隔的列表形式指定这些类别。

以下是 pkginfo 文件中的 CATEGORY 规范示例:


CATEGORY=system

Procedure如何创建 pkginfo 文件

  1. 使用您喜爱的文本编辑器,创建一个名为 pkginfo 的文件。

    可在系统上的任意位置创建此文件。

  2. 编辑该文件并定义五个必需的参数。

    这五个必需的参数是: PKGNAME ARCHVERSIONCATEGORY。有关这些参数的更多信息,请参见创建 pkginfo 文件

  3. 向文件中添加任何可选参数。

    创建您自己的参数,或参见 pkginfo(4) 手册页了解有关标准参数的信息。

  4. 保存所做更改,然后退出编辑器。


示例 2–1 创建 pkginfo 文件

此示例显示了一个有效 pkginfo 文件的内容,其中定义了五个必需的参数以及 BASEDIR 参数。将会在path 字段中更详细地讨论 BASEDIR 参数。


PKG=SUNWcadap
NAME=Chip designers need CAD application software to design abc chips.  
Runs only on xyz hardware and is installed in the usr partition.
ARCH=sparc
VERSION=release 1.0
CATEGORY=system
BASEDIR=/opt

另请参见

请参见如何组织软件包的内容

组织软件包的内容

将软件包对象以分层目录结构进行组织,该结构会模仿软件包对象安装到目标系统上之后的结构。如果您在创建 prototype 文件之前执行此步骤,可节省创建该文件的时间和工作量。

Procedure如何组织软件包的内容

  1. 确定您需要创建的软件包数目,以及哪些软件包对象应位于每个软件包中。

    要获得完成此步骤的帮助,请参见生成软件包之前的注意事项

  2. 为每个需要生成的软件包创建一个目录。

    可在系统上的任意位置创建该目录,并随意进行命名。本章中的示例假定软件包目录的名称与软件包缩写相同。


    $ cd /home/jane
    $ mkdir SUNWcadap
    
  3. 将每个软件包中的软件包对象组织为相应软件包目录下的目录结构。该目录结构必须模仿软件包对象在目标系统上的结构。

    例如,CAD 应用程序软件包 SUNWcadap 必须具有以下目录结构。

    示意图显示 SUNWcadap 软件包目录的结构。
  4. 确定您将保存信息文件的位置。如果合适,请创建一个目录,将这些文件保存在同一位置。

    以下示例假定来自如何创建 pkginfo 文件中的 pkginfo 示例文件在 Jane 的主目录中创建。


    $ cd /home/jane
    $ mkdir InfoFiles
    $ mv pkginfo InfoFiles
    
另请参见

请参见如何使用 pkgproto 命令创建 prototype 文件

创建 prototype 文件

prototype 文件是一种 ASCII 文件,用于指定有关软件包中对象的信息。prototype 文件中的每个条目描述一个对象,例如数据文件、目录、源文件或可执行对象。prototype 文件中的条目由若干个用空格分隔的信息字段组成。请注意,这些字段必须按特定顺序出现。注释行以井号 (#) 开头,将被忽略。

您可以使用文本编辑器或使用 pkgproto 命令创建 prototype 文件。首次创建此文件时,使用 pkgproto 命令可能更容易,因为该命令基于您先前创建的目录分层结构来创建文件。如果您没有根据组织软件包的内容中所述组织文件,您不得不使用喜爱的文本编辑器从头开始创建 prototype 文件,这一任务比较繁琐。

prototype 文件的格式

以下是 prototype 文件中每一行的格式:


partftypeclasspathmajorminormodeownergroup

part

可选的数字字段,可用于将软件包对象分组为各部分。缺省值为 part 1(第 1 部分)。 

ftype

单字符字段,用于指定对象类型。请参见ftype 字段

class

表示对象所属的安装类。请参见class 字段

path

绝对或相对路径名,指示软件包对象在目标系统上的驻留位置。请参见path 字段

major

块特殊设备或字符特殊设备的主设备编号。 

minor

块特殊设备或字符特殊设备的次要设备编号。 

mode

对象的八进制模式(例如,0644)。请参见mode 字段

owner

对象的所有者(例如,binroot)。请参见owner 字段

group

对象所属的组(例如 binsys)。请参见group 字段

通常,只会定义 ftypeclasspathmodeownergroup 字段。以下各节将介绍这些字段。有关这些字段的附加信息,请参见 prototype(4) 手册页。

ftype 字段

ftype(文件类型)字段是一个单字符字段,用于指定软件包对象的文件类型。下表中介绍了有效的文件类型。

表 2–3 prototype 文件中的有效文件类型

文件类型字段值 

文件类型说明 

f

标准可执行文件或数据文件 

e

在安装或删除时将编辑的文件(可由几个软件包共享) 

v

可变文件(其内容预计会更改,例如日志文件) 

d

目录 

x

只能由该软件包访问的专用目录(可能包含未注册的日志或数据库信息) 

l

链接文件 

p

命名管道 

c

字符特殊设备 

b

块特殊设备 

i

信息文件或安装脚本 

s

符号链接 

class 字段

class 字段用于指定对象所属的类。使用类是一种可选的软件包设计功能。将会在编写类操作脚本中详细讨论此功能。

如果您不使用类,则对象属于 none 类。当执行 pkgmk 命令生成软件包时,该命令会在 pkginfo 文件中插入 CLASSES=none 参数。文件类型为 i 的文件必须有一个空的 class 字段。

path 字段

path 字段用于定义软件包对象在目标系统上的驻留位置。您可以使用绝对路径名(例如 /usr/bin/mail)或相对路径名(例如 bin/mail)来指示该位置。使用绝对路径名意味着对象在目标系统上的位置是由软件包定义的,不能更改。使用相对路径名的软件包对象表明该对象是可重定位的

可重定位对象在目标系统上不需要绝对路径位置。此类对象的位置是在安装过程中确定的。

可将所有软件包对象或某些软件包对象定义为可重定位。在编写任何安装脚本或创建 prototype 文件之前,请确定软件包对象将有固定位置(例如 /etc 中的启动脚本)还是可重定位的。

可重定位对象分为两种:可共同重定位的对象可单独重定位的对象

可共同重定位的对象

可共同重定位的对象相对于一个称作基目录的通用安装基本位置进行定位。基目录在 pkginfo 文件中由 BASEDIR 参数定义。例如, prototype 文件中一个名为 tests/generic 的可重定位对象要求 pkginfo 文件定义缺省 BASEDIR 参数。例如:


BASEDIR=/opt

此示例意味着,对象安装后将位于 /opt/tests/generic 目录中。


注 –

/opt 目录是不属于基本 Solaris 软件的软件可以交付到的唯一目录。


只要可能,请尽量使用可共同重定位的对象。一般来说,可以使用指定了绝对路径的几个文件(例如 /etc/var 中的文件)来重定位一个软件包的主要部分。但是,如果一个软件包包含许多不同的重定位对象,请考虑将该软件包分成在 pkginfo 文件中具有明显不同 BASEDIR 值的多个软件包。

可单独重定位的对象

可单独重定位的对象不限于定位到可共同重定位的对象所在的目录位置。要定义一个可单独重定位的对象,需要在 prototype 文件的 path 字段中指定一个安装变量。指定安装变量之后,创建一个 request 脚本来提示安装人员输入可重定位基目录,或者创建一个 checkinstall 脚本基于文件系统数据确定路径名。有关 request 脚本的更多信息,请参见编写 request 脚本;有关 checkinstall 脚本的信息,请参见如何收集文件系统数据


注意 – 注意 –

可单独重定位的对象很难管理。使用可单独重定位的对象可能导致软件包组件的位置四处分散,这样在安装软件包的多个版本或体系结构时很难分离这些组件。只要可能,请尽量使用可共同重定位的对象。


参数化路径名

参数化路径名是包含变量规范的路径名。例如,/opt/$PKGINST/filename 是一个参数化路径名,因为含有 $PKGINST 变量规范。必须pkginfo 文件中为该变量规范定义一个缺省值。然后可以通过 request 脚本或 checkinstall 脚本更改该值。

路径中的变量规范必须位于路径名的开头或结尾,或者由斜线 (/) 分隔。有效的参数化路径名采用以下形式:


$PARAM/tests
tests/$PARAM/generic
/tests/$PARAM

一旦定义了变量规范,可能会导致将路径计算为绝对或可重定位路径。在下面的示例中,prototype 文件包含以下条目:


f none $DIRLOC/tests/generic

pkginfo 文件包含以下条目:


DIRLOC=/myopt

路径名 $DIRLOC/tests/generic 计算为绝对路径名 /myopt/tests/generic(无论是否在 pkginfo 文件中设置了 BASEDIR 参数)。

在此示例中,prototype 文件与前面的示例中完全相同,而 pkginfo 文件包含以下条目:


DIRLOC=firstcut
BASEDIR=/opt

路径名 $DIRLOC/tests/generic 将计算为可重定位的路径名 /opt/firstcut/tests/generic

有关参数化路径名的更多信息,请参见使用参数化基目录

关于对象的源位置和目标位置的简要说明

prototype 文件中的 path 字段定义对象在目标系统上的位置。如果软件包对象的目录结构不模仿目标系统上的预期结构,请在 prototype 文件中指定其当前位置。有关设置软件包对象结构的更多信息,请参见组织软件包的内容

如果您开发区域没有将软件包设置为所需的结构,可在 path 字段中使用 path1=path2 格式。在此格式中,path1 是对象应该在目标系统上所处的位置,而 path2 是对象在您系统中的位置。

还可以在 path1=path2 路径名格式中以 path1 表示可重定位对象的名称,而 path2 表示该对象在您系统上的完整路径名。


注 –

path1 不能包含未定义的生成变量,但是可以包含未定义的安装变量。path2 不能包含任何未定义的变量,虽然可以使用生成变量和安装变量。有关安装变量与生成变量之间区别的信息,请参见软件包环境变量


因为链接是通过 pkgadd 命令创建的,因此它们必须使用 path1= path2 格式。通常,链接的 path2 决不应是绝对的,而是应该相对于 path1 的目录部分。

使用 path1=path2 格式的一个替代方法是使用 !search 命令。有关更多信息,请参见pkgmk 命令提供搜索路径

mode 字段

mode 字段可以包含八进制数、问号 (?) 或变量规范。八进制数指定对象安装在目标系统上时的模式。? 表示在安装对象时模式不会更改,暗指在目标系统中已经存在同名对象。

$mode 形式的变量规范(其中变量的首字母必须是小写字母)意味着将会在生成软件包时设置此字段。请注意,此变量必须在生成时在 prototype 文件中或作为 pkgmk 命令的一个选项定义。有关安装变量与生成变量之间区别的信息,请参见软件包环境变量

文件类型为 i(信息文件)、l(硬链接)和 s(符号链接)的文件应将该字段留空。

owner 字段

owner 字段可以包含用户名、问号 (?) 或变量规范。用户名最多可包含 14 个字符,并且应该是目标系统中已经存在的名称(例如 binroot)。? 表示在安装对象时所有者不会更改,暗指在目标系统中已经存在同名对象。

变量规范的形式可以是 $Owner$owner,其中变量的首字母是大写字母或小写字母。如果变量首字母为一个小写字母,则必须在生成软件包时在 prototype 文件中或作为 pkgmk 命令的一个选项定义该变量。如果变量首字母为大写字母,系统会将变量规范插入 pkginfo 文件中作为缺省值,并且可以在安装时通过 request 脚本重新定义。有关安装变量与生成变量之间区别的信息,请参见软件包环境变量

文件类型为 i(信息文件)和 l(硬链接)的文件应将该字段留空。

group 字段

group 字段可以包含组名、问号 (?) 或变量规范。组名最多可包含 14 个字符,并且应该是目标系统中已经存在的名称(例如 binsys)。? 表示在安装对象时组不会更改,暗指在目标系统中已经存在同名对象。

变量规范的形式可以是 $Group$group,其中变量的首字母是大写字母或小写字母。如果变量首字母为一个小写字母,则必须在生成软件包时在 prototype 文件中或作为 pkgmk 命令的一个选项定义该变量。如果变量首字母为大写字母,系统会将变量规范插入 pkginfo 文件中作为缺省值,并且可以在安装时通过 request 脚本重新定义。有关安装变量与生成变量之间区别的信息,请参见软件包环境变量

文件类型为 i(信息文件)和 l(硬链接)的文件应将该字段留空。

从头创建 prototype 文件

如果您想要从头创建 prototype 文件,可以使用喜爱的文本编辑器创建,为每个软件包对象添加一个条目。有关该文件格式的更多信息,请参见prototype 文件的格式prototype(4) 手册页。不过,在定义了每个软件包对象之后,您可能希望包括prototype 文件添加功能中描述的某些功能。

示例-使用 pkgproto 命令创建 prototype 文件

只要您按照组织软件包的内容中所述组织了您的软件包目录结构,就可以使用 pkgproto 命令生成基本 prototype 文件。例如,使用在前面各节中所述的样例目录结构和 pkginfo 文件时,创建 prototype 文件的命令如下所示:


$ cd /home/jane
$ pkgproto ./SUNWcadap > InfoFiles/prototype

prototype 文件如下所示:

d none SUNWcadap 0755 jane staff
d none SUNWcadap/demo 0755 jane staff
f none SUNWcadap/demo/file1 0555 jane staff
d none SUNWcadap/srcfiles 0755 jane staff
f none SUNWcadap/srcfiles/file5 0555 jane staff
f none SUNWcadap/srcfiles/file6 0555 jane staff
d none SUNWcadap/lib 0755 jane staff
f none SUNWcadap/lib/file2 0644 jane staff
d none SUNWcadap/man 0755 jane staff
f none SUNWcadap/man/windex 0644 jane staff
d none SUNWcadap/man/man1 0755 jane staff
f none SUNWcadap/man/man1/file4.1 0444 jane staff
f none SUNWcadap/man/man1/file3.1 0444 jane staff

注 –

生成软件包的人员的实际所有者和组由 pkgproto 命令记录。一种较好的方法是使用 chown -Rchgrp -R 命令,在运行 pkgproto 命令之前根据需要设置所有者和组。


prototype 示例文件不是完整文件。有关完成该文件的信息,请参见下一节。

优化使用 pkgproto 命令创建的 prototype 文件

虽然 pkgproto 命令在创建初始 prototype 文件时很有用,但它不会为每个需要定义的软件包对象创建条目。此命令不创建全部条目。pkgproto 命令不执行以下任一工作:

创建文件类型为 vexi 的对象条目

至少,您需要修改 prototype 文件,以添加文件类型为 i 的对象。如果您将信息文件和安装脚本存储在软件包目录的第一级中(例如 /home/jane/SUNWcadap/pkginfo),则 prototype 文件中的一个条目将如下所示:


i pkginfo

如果您没有将信息文件和安装脚本存储在软件包目录的第一级中,则需要指定它们的源位置。例如:


i pkginfo=/home/jane/InfoFiles/pkginfo

或者,可以使用 !search 命令指定位置,供 pkgmk 命令在生成软件包时进行查找。有关更多信息,请参见pkgmk 命令提供搜索路径

要为文件类型为 vex 的对象添加条目,请遵循prototype 文件的格式中所述的格式,或参阅 prototype(4) 手册页。


注 –

切记在任何时候都为文件类型为 e(可编辑)的文件指定一个类,并为该类指定一个关联的类操作脚本。否则,在删除软件包期间这类文件将被删除,即使与其他软件包共享路径名时也是如此。


使用多个类定义

如果使用 pkgproto 命令创建基本 prototype 文件,可以将所有软件包对象指定给 none 类或一个特定类。如示例-使用 pkgproto 命令创建 prototype 文件中所示,基本 pkgproto 命令将所有对象指定给 none 类。要将所有对象指定给一个特定类,可使用 -c 选项。例如:


$ pkgproto -c classname /home/jane/SUNWcadap > /home/jane/InfoFiles/prototype

如果使用多个类,您可能需要手动编辑 prototype 文件,并修改每个对象的 class 字段。如果使用类,您还需要在 pkginfo 文件中定义 CLASSES 参数并编写类操作脚本。使用类是可选功能,将在编写类操作脚本中进行详细讨论。

示例-优化使用 pkgproto 命令创建的 prototype 文件

对于在示例-使用 pkgproto 命令创建 prototype 文件中使用 pkgproto 命令创建的 prototype 文件,需要进行几处修改。

prototype 文件添加功能

除了在 prototype 文件中定义每个软件包对象外,您还可以执行以下操作:

有关进行这些更改的信息,请参见以下各节。

定义要在安装时创建的其他对象

可以使用 prototype 文件定义在安装介质上实际没有提供的对象。在安装期间,如果这些对象尚不存在,则使用 pkgadd 命令创建的对象将具有所需的文件类型。

要指定将在目标系统上创建对象,请在 prototype 文件中使用适当文件类型为其添加一个条目。

例如,如果您要在目标系统上创建目录,但是不想在安装介质上提供该目录,请在 prototype 文件中为其添加以下条目:


d none /directory 0644 root other

如果您希望在目标系统上创建一个空文件,prototype 文件中该文件的条目可能如下所示:


f none filename=/dev/null 0644 bin bin

必须在安装介质上提供的对象只有常规文件和编辑脚本(文件类型 evf)以及包含这些内容所需的目录。所有其他对象的创建都与提供的对象、目录、命名管道、设备、硬链接和符号链接无关。

在安装时创建链接

要在软件包安装期间创建链接,请在链接对象的 prototype 文件条目中定义以下内容:

无论软件包是安装为绝对还是可重定位软件包,都将以这种方式指定相对链接。

将软件包分发到多个卷上

使用 pkgmk 命令生成软件包时,该命令将执行组织多卷软件包所需的计算和操作。一个多卷软件包称为分段的软件包

不过,您可以在 prototype 文件中使用可选 part 字段定义希望对象所处的部分。此字段中的一个数字将重写 pkgmk 命令,并强制将组件放置到该字段中指定的部分。请注意,对于设置为文件系统格式的可移除介质,各部分和卷之间存在一对一的对应关系。如果卷由开发者预先指定,当任何卷上存在空间不足情况时,pkgmk 命令会引发错误。

嵌套 prototype 文件

可以创建多个 prototype 文件,然后使用 !include 命令将它们包括在 prototype 文件中。您可能需要嵌套文件以更便于维护。

在以下示例中有三个 prototype 文件。主文件 (prototype) 正被编辑。另外两个文件(proto2proto3)是要包括的文件。


!include /source-dir/proto2
!include /source-dir/proto3

modeownergroup 字段设置缺省值

要为特定软件包对象的 modeownergroup 字段设置缺省值,可将 !default 命令插入到 prototype 文件中。例如:


!default 0644 root other

注 –

!default 命令的作用域从插入位置开始直到文件结束。该命令的作用域不包括内含的文件。


但是,对于您知道在目标系统(例如 /usr/etc/vfstab)上存在的目录(文件类型 d)和可编辑文件(文件类型 e),请确保 prototype 文件中的 modeownergroup 字段设置为问号 (?)。这样就不会销毁站点管理员可能已修改的现有设置。

pkgmk 命令提供搜索路径

如果软件包对象的源位置与其目标位置不同,并且您不希望使用关于对象的源位置和目标位置的简要说明中所述的 path1=path2 格式,则可以在 prototype 文件中使用 !search 命令。

例如,如果您在自己的主目录中创建了目录 pkgfiles,并且该目录包含您的所有信息文件和安装脚本,可以指定在使用 pkgmk 命令生成软件包时搜索该目录。

在 prototype 文件中该命令将如下所示:


!search /home-dir/pkgfiles

注 –

搜索请求不涉及内含的文件。另外,搜索仅限于列出的特定目录,而且不进行递归搜索。


设置环境变量

也可以向 prototype 文件中添加 !PARAM=value 形式的命令。此形式的命令可在当前环境中定义变量。如果有多个 prototype 文件,则此命令的作用域是局部的,仅限于定义它的 prototype 文件。

PARAM 变量的首字母可以是小写字母或大写字母。如果 PARAM 变量的值在生成时未知,pkgmk 命令将出错而异常中止。有关生成变量与安装变量之间区别的更多信息,请参见软件包环境变量

Procedure如何使用 pkgproto 命令创建 prototype 文件


注 –

在创建 prototype 文件之前创建信息文件和安装脚本会更容易,但这种顺序并非是必需的。您始终可在更改软件包内容之后编辑 prototype 文件。有关信息文件和安装脚本的更多信息,请参见第 3 章


  1. 确定哪些软件包对象将是绝对的,哪些软件包对象是可重定位的(如果尚未确定)。

    有关帮助您完成此步骤的信息,请参见path 字段

  2. 组织软件包对象,以模仿其在目标系统上的位置。

    如果您已经按照组织软件包的内容中所述组织了软件包,请注意,您可能需要根据步骤 1 中所做的决策进行一些更改。如果您尚未组织软件包,现在应该进行组织。如果您不组织软件包,则不能使用 pkgproto 命令创建基本 prototype 文件。

  3. 如果您的软件包有可共同重定位的对象,请编辑 pkginfo 文件将 BASEDIR 参数设置为适当的值。

    例如:


    BASEDIR=/opt

    有关可共同重定位对象的信息,请参见可共同重定位的对象

  4. 如果您的软件包有可单独重定位的对象,请创建 request 脚本,以提示安装人员输入适当的路径名。或者,创建 checkinstall 脚本,以基于文件系统数据确定适当的路径。

    以下列表提供了关于常见任务的参考资料页码:

  5. 将您的软件包组件的所有者和组更改为目标系统上所需的所有者和组。

    对软件包目录和信息文件目录使用 chown -Rchgrp -R 命令。

  6. 执行 pkgproto 命令创建基本 prototype 文件。

    pkgproto 命令会扫描您的目录来创建基本文件。例如:


    $ cd package-directory
    $ pkgproto ./package-directory > prototype
    

    prototype 文件可位于您系统上的任意位置。将信息文件和安装脚本保存在一个位置可简化访问和维护。有关 pkgproto 命令的附加信息,请参见 pkgproto(1) 手册页。

  7. 使用您喜爱的文本编辑器编辑 prototype 文件,并为类型为 vexi 的文件添加条目。

    有关您可能需要进行的特定更改的信息,请参见优化使用 pkgproto 命令创建的 prototype 文件

  8. (可选)如果您使用多个类,请编辑 prototypepkginfo 文件。使用您喜爱的文本编辑器进行必要的更改,并创建相应的类操作脚本。

    有关您可能需要进行的特定更改的信息,请参见优化使用 pkgproto 命令创建的 prototype 文件编写类操作脚本

  9. 使用您喜爱的文本编辑器编辑 prototype 文件,以便重新定义路径名和更改其他字段设置。

    有关更多信息,请参见优化使用 pkgproto 命令创建的 prototype 文件

  10. (可选)使用您喜爱的文本编辑器编辑 prototype 文件,以便向 prototype 文件添加功能。

    有关更多信息,请参见prototype 文件添加功能

  11. 保存所做更改,然后退出编辑器。

另请参见

如果您已准备好执行下一个任务,请参见如何生成软件包

生成软件包

可使用 pkgmk 命令生成软件包。pkgmk 命令可执行以下任务:

使用最简单的 pkgmk 命令

此命令最简单的形式是不带任何选项的 pkgmk 命令。在使用不带选项的 pkgmk 命令之前,请确保您的当前工作目录包含软件包的 prototype 文件。命令的输出、文件和目录都被写入 /var/spool/pkg 目录。

pkgmap 文件

当使用 pkgmk 命令生成软件包时,它将创建一个替换 prototype 文件的 pkgmap 文件。来自上一个示例中的 pkgmap 文件包含以下内容:


$ more pkgmap
: 1 3170
1 d none SUNWcadap 0755 root sys
1 d none SUNWcadap/demo 0755 root bin
1 f none SUNWcadap/demo/file1 0555 root bin 14868 45617 837527496
1 d none SUNWcadap/lib 0755 root bin
1 f none SUNWcadap/lib/file2 0644 root bin 1551792 62372 837527499
1 d none SUNWcadap/man 0755 bin bin
1 d none SUNWcadap/man/man1 0755 bin bin
1 f none SUNWcadap/man/man1/file3.1 0444 bin bin 3700 42989 837527500
1 f none SUNWcadap/man/man1/file4.1 0444 bin bin 1338 44010 837527499
1 f none SUNWcadap/man/windex 0644 root other 157 13275 837527499
1 d none SUNWcadap/srcfiles 0755 root bin
1 f none SUNWcadap/srcfiles/file5 0555 root bin 12208 20280 837527497
1 f none SUNWcadap/srcfiles/file6 0555 root bin 12256 63236 837527497
1 i pkginfo 140 10941 837531104
$

此文件格式非常类似于 prototype 文件的格式。但是,pkgmap 文件包含以下信息:

Procedure如何生成软件包

  1. 创建 pkginfo 文件,如果尚未创建。

    有关逐步说明,请参见如何创建 pkginfo 文件

  2. 创建 prototype 文件,如果尚未创建。

    有关逐步说明,请参见如何使用 pkgproto 命令创建 prototype 文件

  3. 将您的当前工作目录设置为包含软件包的 prototype 文件的目录。

  4. 生成软件包。


    $ pkgmk [-o] [-a arch] [-b base-src-dir] [-d device]
       [-f filename] [-l limit] [-p pstamp] [-r rootpath]
       [-v version] [PARAM=value] [pkginst]
    -o

    覆写软件包的现有版本。

    -a arch

    重写 pkginfo 文件中的体系结构信息。

    -b base-src-dir

    pkgmk 命令在开发系统上搜索对象时,要求将 base-src-dir 添加到可重定位路径名的开头。

    -d device

    指定应将软件包复制到 device 上(可能是一个绝对目录路径名、磁盘或可移除磁盘)。

    -f filename

    指定一个文件 filename 作为您的 prototype 文件。缺省名称是 prototypePrototype

    -l limit

    以 512 字节块为单位指定输出设备的最大大小。

    -p pstamp

    重写 pkginfo 文件中的生产标记定义。

    -r rootpath

    请求将根目录 rootpath 用于在开发系统上定位对象。

    -v version

    重写 pkginfo 文件中的版本信息。

    PARAM=value

    设置全局环境变量。首字母为小写字母的变量在生成时被解析。首字母为大写字母的变量被放置到 pkginfo 文件中供安装时使用。

    pkginst

    按软件包缩写或特定实例(例如,SUNWcadap.4)指定软件包。

    有关更多信息,请参见 pkgmk(1) 手册页。

  5. 验证软件包的内容。


    $ pkgchk -d device-name pkg-abbrev
    Checking uninstalled directory format package pkg-abbrev
    from device-name
    ## Checking control scripts.
    ## Checking package objects.
    ## Checking is complete.
    $
    -d device-name

    指定软件包的位置。请注意,device-name 可以是完整目录路径名或者磁带或可移除磁盘的标识符。

    pkg-abbrev

    待检查的一个或多个软件包(由空格分隔)的名称。如果省略,pkgchk 命令将检查所有可用的软件包。

    pkgchk 命令会列出检查软件包的哪些方面,并根据情况显示警告或错误。有关 pkgchk 命令的更多信息,请参见验证软件包的完整性


    注意 – 注意 –

    应该非常认真地对待错误。错误可能意味着需要修正脚本。如果您不认同 pkgchk 命令的输出,请检查所有错误,然后继续。



示例 2–2 生成软件包

此示例使用在优化使用 pkgproto 命令创建的 prototype 文件中创建的 prototype 文件。


$ cd /home/jane/InfoFiles
$ pkgmk
## Building pkgmap from package prototype file.
## Processing pkginfo file.
WARNING: parameter  set to "system990708093144"
WARNING: parameter  set to "none"
## Attempting to volumize 13 entries in pkgmap.
part  1 -- 3170 blocks, 17 entries
## Packaging one part.
/var/spool/pkg/SUNWcadap/pkgmap
/var/spool/pkg/SUNWcadap/pkginfo
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/demo/file1
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/lib/file2
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/man1/file3.1
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/man1/file4.1
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/windex
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/srcfiles/file5
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/srcfiles/file6
## Validating control scripts.
## Packaging complete.
$


示例 2–3 指定可重定位文件的源目录

如果您的软件包中包含可重定位文件,可使用 pkgmk 命令的 -b base-src-dir 选项,来指定在创建软件包期间将添加到可重定位路径名开头的路径名。如果您没有为可重定位文件使用 path1=path2 格式,或没有在 prototype 文件中使用 !search 命令指定搜索路径,该选项很有用。

以下命令将生成具有下列特征的软件包:


$ cd /home/jane/InfoFiles
$ pkgmk -o -b /home/jane
## Building pkgmap from package prototype file.
## Processing pkginfo file.
WARNING: parameter  set to "system960716102636"
WARNING: parameter  set to "none"
## Attempting to volumize 13 entries in pkgmap.
part  1 -- 3170 blocks, 17 entries
## Packaging one part.
/var/spool/pkg/SUNWcadap/pkgmap
/var/spool/pkg/SUNWcadap/pkginfo
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/demo/file1
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/lib/file2
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/man1/file3.1
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/man1/file4.1
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/windex
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/srcfiles/file5
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/srcfiles/file6
## Validating control scripts.
## Packaging complete.

在此示例中,通过指定 -o 选项在缺省目录 /var/spool/pkg 中生成软件包。此选项会覆写在示例 2–2 中创建的软件包。



示例 2–4 为信息文件和软件包对象指定不同的源目录

如果您将软件包信息文件(例如 pkginfo prototype)和软件包对象放置在两个不同的目录中,可使用 pkgmk 命令的 -b base-src-dir-r rootpath 选项创建软件包。如果您的软件包对象位于名为 /product/pkgbin 的目录中,而其他软件包信息文件位于名为 /product/pkgsrc 的目录,可以使用以下命令将软件包放置在 /var/spool/pkg 目录下:


$ pkgmk -b /product/pkgbin -r /product/pkgsrc -f /product/pkgsrc/prototype

可选择使用以下命令获得相同结果:


$ cd /product/pkgsrc
$ pkgmk -o -b /product/pkgbin

在此示例中,pkgmk 命令使用当前工作目录查找软件包的剩余部分(例如 prototype pkginfo 信息文件)。


另请参见

如果您要为软件包添加任何可选信息文件和安装脚本,请参见第 3 章。否则,在生成软件包之后,应该验证其完整性。第 4 章介绍了如何执行此任务,并提供了有关如何将经过验证的软件包转换为分发介质的逐步说明。