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

所有关键字也可以在括号中带有可选参数。参数包括所有者、组和模式。此参数用于引用的文件或目录。要更改配置文件的所有者、组和模式,请使用:

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

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

@sample(,games,660) etc/config.sample
%%FOO%%@sample etc/orbit.conf.sample

这是因为选项 plist 助手用于注释掉该行,因此它们需要放在最前面。有关更多信息,请参见 OPTIONS_SUB 。

8.6.1. @desktop-file-utils

安装和卸载后将运行 update-desktop-database -q 。永远不要直接使用,将 USES=desktop-file-utils 添加到 Makefile 中。

8.6.2. @fc 目录

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

8.6.3. @fontsdir 目录

为传递为参数的目录添加一个 @dir 条目,并在安装和卸载后在该目录上运行 mkfontscale 和 mkfontdir 。此外,在卸载时,如果字体.scale 和字体.dir 缓存文件为空,则会删除它们。

8.6.4. @info 文件

将作为参数传递的文件添加到 plist 中,并在安装和卸载时更新信息文档索引。此外,如果索引为空,则在卸载时删除索引。永远不应手动使用此功能,而应始终通过 INFO 进行操作。有关更多信息,请参阅信息文件。

8.6.5. @kld 目录

在安装和卸载时运行 kldxref 目录。另外,在卸载时,如果目录为空,则会将其删除。

8.6.6. @rmtry 文件

在卸载时将删除文件,并且如果文件不存在不会报错。

8.6.7. @sample 文件 [文件]

用于处理设置文件的安装,通过包中捆绑的示例文件。实际的非示例文件要么是第二个文件名(如果存在),要么是没有 .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 中的*.terminfo 文件刷新。

8.6.11. 基本关键字

有一些硬编码的关键字,在 pkg-create(8)中有详细文档。为了完整起见,它们也在这里有文档记录。

8.6.11.1. @ [文件]

当文件的所有者、组或权限需要更改时,请使用空关键字作为占位符。 例如,要将文件的组设置为 games 并添加 setgid 位,请添加:

@(,games,2755) sbin/daemon

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

在软件包安装或卸载过程中执行命令。

@preexec 命令

在预安装脚本的一部分执行命令。

@postexec 命令

将命令作为安装后脚本的一部分执行。

@preunexec 命令

作为预卸载脚本的一部分执行命令。

@postunexec 命令

作为后卸载脚本的一部分执行命令。

如果命令包含这些序列中的任何一个,它们将在命令中内联展开。对于这些示例,假设 @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) 使用的格式相同。无参数使用可将权限设置为默认权限(在打包时文件的模式)。

8.6.11.4. @owner 用户

将所有后续文件的默认所有权设置为用户。不带参数使用可将其设置回默认所有权( root )。

8.6.11.5. @group 组

将所有后续文件的默认组所有权设置为组。不带参数使用可将默认组所有权设置回默认值( wheel )。

8.6.11.6. @comment 字符串

打包时忽略此行。

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. attributes

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

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

8.6.12.2. action

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

setprefix

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

dir

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

dirrm

注册一个目录,在卸载时删除。已弃用。

dirrmtry

注册一个目录以尝试并在卸载时删除。已弃用。

file

注册一个文件。

setmode

设置下一个属性列表条目的模式。

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 命令, @postexec 命令, @preunexec 命令, @postunexec 命令中描述的 @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 中文社区 2024