第9章. pkg-*

我们还没有提到一些关于有时会派上用场的 pkg-* 文件的技巧。

9.1. pkg-message

要显示在安装软件包时显示的消息,请将消息放在 pkg-message 中。此功能通常用于在 pkg installpkg upgrade 后显示需要采取的其他安装步骤。

  • pkg-message 只能包含对 FreeBSD 上的设置和操作至关重要的信息,并且该信息对于所讨论的 Port 来说是唯一的。

  • 设置信息仅应在初始安装时显示。升级说明仅应在从相关版本升级时显示。

  • 不要用空格或符号行(如 ----------==========)包围消息。将格式留给 pkg(8)

  • 提交者可以全面批准使用 UCL 格式规范将现有消息限制为安装或升级范围。

  • 请务必参考处理服务的正确工具。

    • 使用 service name start 启动服务,而不是使用 /usr/local/etc/rc.d/name start

    • 使用 sysrc name_enable=YES 更改 rc.conf 中的选项

pkg-message 支持两种格式

原始

一个普通的纯文本文件。其消息仅在安装时显示。

UCL

如果文件以“[”开头,则它被认为是 UCL 文件。UCL 格式在 libucl 的 GitHub 页面 上进行了描述。

不要在 pkg-plist 中添加 pkg-message 的条目。

9.1.1. pkg-message 中的 UCL

格式如下。它应该是一个对象数组。对象本身可以具有以下关键字

消息

要显示的实际消息。此关键字是必需的。

类型

何时显示消息。

最大版本

仅当 typeupgrade 时。如果从严格低于指定版本的版本升级,则显示。

最小版本

仅当typeupgrade时显示。如果从严格高于指定版本的版本升级,则显示。

maximum_versionminimum_version关键字可以组合使用。

type关键字可以有三个值

install

仅在安装软件包时显示消息。

remove

仅在删除软件包时显示消息。

upgrade

仅在升级软件包期间显示消息。

为了保持与非 UCL pkg-message 文件的兼容性,UCL pkg-message 文件的第一行**必须**是单个“[”,最后一行**必须**是单个“]”。

示例 1. UCL 短字符串

消息由双引号"分隔,这用于简单的单行字符串。

[
{ type: install
  message: "Simple message"
}
]
示例 2. UCL 多行字符串

多行字符串使用标准的here document表示法。多行分隔符**必须**紧跟在<<符号之后,中间没有空格,并且**必须**仅由大写字母组成。要结束多行字符串,请在单独一行上添加分隔符字符串,中间没有空格。UCL 短字符串中的消息可以写成

[
{ type: install
  message: <<EOM
Simple message
EOM
}
]
示例 3. 在安装/卸载时显示消息

当消息只需要在安装或卸载时显示时,请设置type

[
{
  type: remove
  message: "package being removed."
}
{ type: install, message: "package being installed."}
]
示例 4. 在升级时显示消息

当端口升级时,显示的消息可以更贴合端口的需要。

[
{
  type: upgrade
  message: "Package is being upgraded."
}
{
  type: upgrade
  maximum_version: "1.0"
  message: "Upgrading from before 1.0 need to do this."
}
{
  type: upgrade
  minimum_version: "1.0"
  message: "Upgrading from after 1.0 should do that."
}
{
  type: upgrade
  maximum_version: "3.0"
  minimum_version: "1.0"
  message: "Upgrading from > 1.0 and < 3.0 remove that file."
}
]

在升级时显示消息时,限制何时向用户显示消息非常重要。大多数情况下,它是通过使用maximum_version将它的使用限制在特定操作需要在某个版本之前进行的升级。

9.2. pkg-install、pkg-pre-install和pkg-post-install

如果端口需要在使用pkg addpkg install安装二进制包时执行命令,请使用pkg-install。它由pkg运行两次,第一次在安装包之前作为${SH} pkg-install ${PKGNAME} PRE-INSTALL运行,第二次在安装包之后作为${SH} pkg-install ${PKGNAME} POST-INSTALL运行。可以通过测试$2来确定脚本运行的模式。PKG_PREFIX环境变量设置为软件包安装目录。

如果改用pkg-pre-installpkg-post-install,则脚本仅运行一次(在安装包之前或之后),并带有一个参数${PKGNAME}。使用pkg-pre-install.luapkg-post-install.lua将运行Lua脚本而不是shell脚本。pkg运行的Lua脚本提供了一些扩展和一些限制,两者都在pkg-lua-script(5)中进行了说明。

建议使用pkg-pre-install(或pkg-pre-install.lua)和pkg-post-install(或pkg-post-install.lua),而不是使用pkg-install

这些脚本会自动添加到打包列表中。

这些脚本旨在简化安装后的软件包配置。**不得**滥用它们来启动服务、停止服务或运行任何其他会修改当前正在运行的系统的命令。

9.3. pkg-deinstall、pkg-pre-deinstall和pkg-post-deinstall

这些脚本在删除软件包时执行。

pkg delete运行pkg-deinstall脚本两次。第一次在卸载端口之前作为${SH} pkg-deinstall ${PKGNAME} DEINSTALL运行,第二次在端口卸载之后作为${SH} pkg-deinstall ${PKGNAME} POST-DEINSTALL运行。可以通过测试$2来确定脚本运行的模式。PKG_PREFIX环境变量设置为软件包安装目录。

如果改用pkg-pre-deinstallpkg-post-deinstall,则脚本仅运行一次(在卸载包之前或之后),并带有一个参数${PKGNAME}。使用pkg-pre-deinstall.luapkg-post-deinstall.lua将运行Lua脚本而不是shell脚本。pkg运行的Lua脚本提供了一些扩展和一些限制,两者都在pkg-lua-script(5)中进行了说明。

建议使用pkg-pre-deinstall(或pkg-pre-deinstall.lua)和pkg-post-deinstall(或pkg-post-deinstall.lua),而不是使用pkg-deinstall

这些脚本会自动添加到打包列表中。

这些脚本旨在简化软件包卸载后的清理工作。**不得**滥用它们来启动服务、停止服务或运行任何其他会修改当前正在运行的系统的命令。

9.4. 更改pkg-*的名称

所有pkg-*的名称都是使用变量定义的,如果需要,可以在Makefile中更改这些变量。当在多个端口之间共享相同的pkg-*文件或需要写入其中一个文件时,这尤其有用。请参阅写入除WRKDIR之外的位置,了解为什么直接写入包含pkg-*文件的目录是一个坏主意。

以下是变量名称及其默认值的列表。(PKGDIR默认为${MASTERDIR}。)

变量默认值

DESCR

${PKGDIR}/pkg-descr

PLIST

${PKGDIR}/pkg-plist

PKGINSTALL

${PKGDIR}/pkg-install

PKGPREINSTALL

${PKGDIR}/pkg-pre-install

PKGPOSTINSTALL

${PKGDIR}/pkg-post-install

PKGDEINSTALL

${PKGDIR}/pkg-deinstall

PKGPREDEINSTALL

${PKGDIR}/pkg-pre-deinstall

PKGPOSTDEINSTALL

${PKGDIR}/pkg-post-deinstall

PKGMESSAGE

${PKGDIR}/pkg-message

9.5. 使用SUB_FILESSUB_LIST

SUB_FILESSUB_LIST对于端口文件中的动态值很有用,例如pkg-message中的安装PREFIX

SUB_FILES指定要自动修改的文件列表。SUB_FILES列表中的每个file都必须在FILESDIR中有一个对应的file.in。将创建一个修改后的版本作为${WRKDIR}/file。定义为USE_RC_SUBR值的会被自动添加到SUB_FILES中。对于文件pkg-messagepkg-installpkg-deinstall,相应的Makefile变量会自动设置为指向处理后的版本。

SUB_LISTVAR=VALUE对的列表。对于每一对,%%VAR%%将被替换为SUB_FILES中列出的每个文件中的VALUE。自动定义了一些常见的对:PREFIXLOCALBASEDATADIRDOCSDIREXAMPLESDIRWWWDIRETCDIR。任何以@comment后跟空格开头的行,在变量替换后都将从结果文件中删除。

此示例将pkg-message中的%%ARCH%%替换为系统架构。

SUB_FILES=	pkg-message
SUB_LIST=	ARCH=${ARCH}

请注意,对于此示例,pkg-message.in必须存在于FILESDIR中。

一个好的pkg-message.in示例

Now it is time to configure this package.
Copy %%PREFIX%%/shared/examples/putsy/%%ARCH%%.conf into your home directory
as .putsy.conf and edit it.

上次修改时间:2024年9月23日,作者 Fernando Apesteguía