8.6.用关键词扩展软件包列表

所有的关键词都可以在括号里使用可选的参数。这些参数是所有者、组和模式。这个参数用于被引用的文件或目录。要改变一个配置文件的所有者、组和模式,请使用。

@sample(games,games,640) etc/config.sample

参数是可选的。如果只需要改变组和模式,请使用。

@sample(,games,660) etc/config.sample

警告

如果在可选条目上使用关键字,则必须在 helper 之后添加:

%%FOO%%@sample etc/orbit.conf.sample

这是因为 options plist helper 是用来注释这一行的,所以需要放在前面。参见 OPTIONS_SUB 以了解更多信息。

8.6.1. @desktop-file-utils

将在安装和卸载后运行 update-desktop-database -q。千万 不要 直接使用,应在 Makefile 中加入 USES=desktop-file-utils

8.6.2. @fc 目录

为作为参数传递的目录添加一个 @dir 条目,并在安装和卸载后在该目录上运行 fc-cache -fs

8.6.3. @fontsdir 目录

为作为参数传递的目录添加一个 @dir 条目,并在安装和卸载后对该目录运行 mkfontscalemkfontdir。此外,在卸载时,如果 fonts.scalefonts.dir 的缓存文件为空,它将删除这些文件。

8.6.4. @info 文件

将作为参数传递的文件添加到 plist 中,并在安装和卸载时更新 info 文件的索引。此外,如果在卸载时是空的,它会删除索引。这绝不应该手动使用,而应该始终通过 INFO 使用。更多信息见信息文件

8.6.5. @kld 目录

在安装和卸载时对该目录运行 kldxref。此外,在卸载时,如果是空的,它将删除该目录。

8.6.6. @rmtry 文件

将在卸载时删除文件,如果文件不在那里,则不会给出错误。

8.6.7. @sample 文件 [file]

这是用来处理配置文件的安装,通过与软件包捆绑的示例文件。实际的“非样本文件”是第二个文件名,如果存在的话,或者是第一个没有 .sample 扩展名的文件名。

这做了三件事。首先,将作为参数传递的第一个文件,即样本文件,添加到 plist 中。然后,在安装时,如果没有找到实际的文件,就把样本文件复制到实际文件中。最后,在卸载时,如果实际文件没有被修改,则删除该文件。更多信息见配置文件

8.6.8. @shared-mime-info 目录

在安装和卸载时对该目录运行 update-mime-database

8.6.9. @shell 文件

将作为参数传递的文件添加到 plist 中。

在安装时,将 文件 的完整路径添加到 /etc/shells ,同时确保它不会被添加两次。在卸载时,从 /etc/shells 中删除它。

8.6.10. @terminfo

请不要单独使用。如果 port 安装了 *.terminfo 文件, 则应将其加入到 Makefile 中。

在安装和卸载时,如果存在 tic,则应从 ${PREFIX}/shared/misc/terminfo.db 中刷新 ${PREFIX}/shared/misc 中的 *.terminfo 文件。

8.6.11. 基本关键词

有一些关键词是硬编码的, 并在 pkg-create(8) 中有所记录。为了完整起见,这里也对它们进行了记录。

8.6.11.1. @ [file]

空关键字作为一个占位符在需要改变文件的所有者、组或模式时使用。例如,要将文件的组设置为 games,并添加 setgid 位,请添加:

@(,games,2755) sbin/daemon

8.6.11.2. @preexec 命令 , @postexec 命令 , @preunexec 命令 , @postunexec 命令

执行 命令 作为软件包安装或卸载过程的一部分。

@preexec 命令

作为 pre-install 脚本的一部分执行 命令

@postexec 命令

作为 post-install 脚本的一部分执行 命令

@preunexec 命令

作为 pre-deinstall 的一部分执行 命令

@postunexec 命令

作为 post-deinstall 脚本的一部分执行 命令

如果 命令 中包含这些序列中的任何一个,它们会被内联展开。在这些例子中,假设 @cwd 被设置为 /usr/local ,最后解压的文件是 bin/emacs

%F

扩展到最后解压的文件名(如指定)。在例子中的 bin/emacs

%D

扩展到当前目录的前缀,如用 @cwd 设置的。在例子中, /usr/local

%B

扩展到完全合格的文件名的基名,也就是当前目录前缀加上最后一个文件名,减去尾部的文件名。在本例中,这将是 /usr/local/bin

%f

扩展到完全限定名称的文件名部分,或者与 %B 相反。在这个例子中,就是 emacs

重要

这些关键字在这里是为了帮助你设置软件包,使其尽可能随时可用。它们 不能 被滥用来启动服务、停止服务或运行任何其他会修改当前运行系统的命令。

8.6.11.3. @mode 模式

将所有随后解压的文件的模式设置为默认权限。格式与 chmod(1) 使用的相同。在不带参数的情况下设置回默认权限(文件在打包时的模式)。

重要

这必须是一个数字模式,如 6444755600。它不能是相对模式,如 u+s

8.6.11.4. @owner 用户

将所有后续文件的默认所有权设置为用户。使用不含参数的方法,可以设置回默认所有权(root)。

8.6.11.5. @group group

将所有后续文件的默认组所有权设置为组。使用不含参数的方法,可以将组的所有权设置为默认的(wheel)。

8.6.11.6. @comment string

这一行在打包时被忽略。

8.6.11.7. @dir 目录

声明目录名称。默认情况下,由软件包安装在 PREFIX 下创建的目录会被自动删除。当需要在 PREFIX 下创建一个空的目录时,或者当这个目录需要有非默认的所有者、组或模式时,可以使用这个功能。PREFIX 之外的目录需要被注册。例如, /var/db/${PORTNAME} 需要有一个 @dir 条目,而 ${PREFIX}/shared/${PORTNAME} 如果包含文件或使用默认的所有者、组和模式,则不需要。

8.6.11.8. @exec 命令 , @unexec 命令 (已弃用)

执行 命令 作为安装或卸载过程的一部分。请使用 @preexec 命令@postexec 命令@preunexec 命令@postunexec 命令 代替。

8.6.11.9. @dirrm 目录 (已弃用)

声明在卸载时要删除的目录名称。默认情况下, 由软件包安装在 PREFIX 下创建的目录会在卸载软件包时被删除。

8.6.11.10. @dirrmtry 目录 (已弃用)

声明要删除的目录名称,和 @dirrm 一样,但如果目录不能被删除,则不会发出警告。

8.6.12. 创建新的关键字

软件包列表文件可以通过在 ${PORTSDIR}/Keywords 目录中定义的关键字来扩展。每个关键字的设置都存储在一个名为 keyword.ucl 的 UCL 文件中。该文件必须至少包含这些部分中的一个:

  • attributes

  • action

  • pre-install

  • post-install

  • pre-deinstall

  • post-deinstall

  • pre-upgrade

  • post-upgrade

8.6.12.1. 属性

改变关键字所使用的所有者、组或模式。包含一个关联数组,其中可能的键是 ownergroupmode。其值分别是一个用户名、一个组名和一个文件模式。例如:

attributes: { owner: "games", group: "games", mode: 0555 }

8.6.12.2. 行动

定义了对关键字的参数的处理方式。包含一个数组,其中可能的值是:

setprefix

设置下一个 plist 条目的前缀。

dir

注册一个目录,安装时创建,卸载时删除。

dirrm

注册一个要在卸载时删除的目录。已废弃。

dirrmtry

注册一个要尝试的目录,并在卸载时删除。已废弃。

file

注册一个文件。

Setmode

设置下一个 plist 条目的模式。

Setowner

为下一个 plist 条目设置所有者。

setgroup

为下一个 plist 条目设置组。

comment

不做任何事情,等同于不进入 action 部分。

ignore_next

忽略 plist 中的下一个条目。

8.6.12.3. arguments

如果设置为 true,增加了参数处理,将整行的 %@ 分割成编号的参数,%1%2,等等。例如,对于这一行:

@foo some.content other.content

%1%2 将包含:

some.content
other.content

它也会影响到 action 项的工作方式。当有一个以上的参数时,必须指定参数编号。比如说:

actions: [file(1)]

8.6.12.4. pre-install, post-install, pre-deinstall, post-deinstall, pre-upgrade, post-upgrade

这些关键字包含了一个 sh(1) 脚本,将在安装、卸载或升级软件包之前或之后执行。除了 @preexec command , @postexec command , @preunexec command , @postunexec command 中描述的常见的 @exec *%foo* 占位符之外,还有一个新的占位符,即 %@,它表示关键字的参数。

8.6.12.5. 自定义关键字的例子

例子2. 一个 @dirrmtryecho 关键字的例子

这个关键字做了两件事,它在打包列表中添加了一个 @dirrmtry directory 行,并呼应在卸载软件包时该目录被删除的事实。

actions: [dirrmtry]
post-deinstall: <<EOD
 echo "Directory %D/%@ removed."
EOD

例子3. 现实生活中的例子,如何实现 @sample

这个关键字做了三件事。它将作为参数传递给 @sample 的第一个文件名添加到打包列表中,它在 post-install 脚本中添加了指示,将样本复制到实际的配置文件中(如果它还不存在),它还在 post-deinstall 中添加了指示,将配置文件删除(如果它没有被修改)。

actions: [file(1)]
arguments: true
post-install: <<EOD
 case "%1" in
 /*) sample_file="%1" ;;
 *) sample_file="%D/%1" ;;
 esac
 target_file="${sample_file%.sample}"
 set -- %@
 if [ $# -eq 2 ]; then
     target_file=${2}
 fi
 case "${target_file}" in
 /*) target_file="${target_file}" ;;
 *) target_file="%D/${target_file}" ;;
 esac
 if ! [ -f "${target_file}" ]; then
   /bin/cp -p "${sample_file}" "${target_file}" && \
     /bin/chmod u+w "${target_file}"
 fi
EOD
pre-deinstall: <<EOD
 case "%1" in
 /*) sample_file="%1" ;;
 *) sample_file="%D/%1" ;;
 esac
 target_file="${sample_file%.sample}"
 set -- %@
 if [ $# -eq 2 ]; then
     set -- %@
     target_file=${2}
 fi
 case "${target_file}" in
 /*) target_file="${target_file}" ;;
 *) target_file="%D/${target_file}" ;;
 esac
 if cmp -s "${target_file}" "${sample_file}"; then
   rm -f "${target_file}"
 else
   echo "You may need to manually remove ${target_file} if it is no longer needed."
 fi
EOD

最后更新于

FreeBSD 中文社区