FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • FreeBSD Port 开发者手册翻译项目
  • 编辑日志
  • 译者说明
  • FreeBSD Port 开发者手册
    • FreeBSD Port 开发者手册
  • 第1章 简介
    • 1.1.简介
  • 第2章 制作新的 port
    • 2.1.制作新的 port
  • 第3章 简单的 port
    • 3.1.编写 Makefile
    • 3.2.编写描述文件
    • 3.3.创建校验和文件
    • 3.4.测试 port
    • 3.5.用 portlint 来检查 port
    • 3.6.提交新的 port
  • 第4章 复杂的 Port
    • 4.1 Port 工作原理
    • 4.2.获取源代码
    • 4.3.修改 port
    • 4.4.打补丁
    • 4.5.配置
    • 4.6.处理用户输入
  • 第5章 配置 Makefile
    • 5.1.原始来源
    • 5.2.命名
    • 5.3.归类
    • 5.4.源代码包文件
    • 5.5.维护者(MAINTAINER)
    • 5.6.一句话说明(COMMENT)
    • 5.7.项目网站
    • 5.8.许可证
    • 5.9.PORTSCOUT
    • 5.10.依赖
    • 5.11.从属 port 和 MASTERDIR
    • 5.12.man 手册
    • 5.13.info 文件
    • 5.14.Makefile 参数
    • 5.15.特殊的工作目录
    • 5.16.解决冲突
    • 5.17.安装文件
    • 5.18. 使用 BINARY_ALIAS 来重命名命令,而不是在编译中打补丁
  • 第6章 特殊情况
    • 第6章 特殊情况
  • 第7章 Flavors
    • 7.1.Flavors 简介
    • 7.2.使用 FLAVORS
    • 7.3.USES=php 和 Flavors
    • 7.4.USES=python 和 Flavors
    • 7.5.USES=lua 和 Flavors
  • 第8章 高级 pkg-plist 实践
    • 8.1.根据 make 变量对 pkg-plist 进行修改
    • 8.2.空目录
    • 8.3.配置文件
    • 8.4.动态与静态软件包列表
    • 8.5.自动创建软件包列表
    • 8.6.用关键词扩展软件包列表
  • 第9章 pkg-*
    • 9.1.pkg-message(安装二进制包时显示的消息文件)
    • 9.2.pkg-install、pkg-pre-install 和 pkg-post-install(安装二进制包时执行的脚本文件)
    • 9.3.pkg-deinstall、pkg-pre-deinstall 和 pkg-post-deinstall(卸载时执行的脚本文件)
    • 9.4.修改 pkg-* 文件的名字
    • 9.5.使用 SUB_FILES 和 SUB_LIST
  • 第10章 测试 port
    • 10.1.运行 make describe
    • 10.2.运行 make test
    • 10.3.Portclippy / Portfmt
    • 10.4.Portlint
    • 10.5.Port 工具
    • 10.6.PREFIX 和 DESTDIR
    • 10.7.Poudriere
    • 10.8.调试 port
  • 第11章 升级 port
    • 11.1.使用 Git 制作补丁
    • 11.2.UPDATING 和 MOVED
  • 第12章 安全
    • 12.1.安全为何如此重要
    • 12.2.修复安全漏洞
    • 12.3.向社区通报情况
  • 第13章 该做什么和不该做什么
    • 第13章 该做什么和不该做什么
  • 第14章 一个简单的 port
    • 第14章 一个简单的 port
  • 第15章 在 Port Makefile 中变量的顺序
    • 第15章 在 Port Makefile 中变量的顺序
  • 第16章 保持更新
    • 第16章 保持更新
  • 第17章 使用 USES 宏
    • 第17章 使用 USES 宏
  • 第18章 __FreeBSD_version 的值
    • 第18章 __FreeBSD_version 的值
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
  • 8.6.1. @desktop-file-utils
  • 8.6.2. @fc 目录
  • 8.6.3. @fontsdir 目录
  • 8.6.4. @info 文件
  • 8.6.5. @kld 目录
  • 8.6.6. @rmtry 文件
  • 8.6.7. @sample 文件 [文件]
  • 8.6.8. @shared-mime-info 目录
  • 8.6.9. @shell 文件
  • 8.6.10. @terminfo
  • 8.6.11. 基本关键字
  • 8.6.12. 创建新关键字
在GitHub上编辑
导出为 PDF
  1. 第8章 高级 pkg-plist 实践

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
上一页8.5.自动创建软件包列表下一页9.1.pkg-message(安装二进制包时显示的消息文件)

最后更新于2天前