应用程序包开发者指南

创建 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. 保存所做更改,然后退出编辑器。

另请参见

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