如何在显示 debconf 提示符之前先解压 debain 包?

如何在显示 debconf 提示符之前先解压 debain 包?

我正在研究 Debian 打包源,以便在用户机器上安装一些文件。debconf/config 脚本和 postinst 脚本使用了一些通用逻辑。因此,我将通用逻辑放在一个单独的文件中,并将其作为软件包的一部分添加到 /usr/share/pkg-name/ 下。

现在,当我使用 dpkg 安装软件包时,一切都正常。首先,软件包被解压,包含通用代码库的文件被放置在所述路径中。接下来,debconf/config 脚本读取该文件,然后相应地提示用户。

当我将文件放入 APT 存储库中时,使用 apt-get 安装时会执行相同的过程。首先不会解压软件包,而是显示 debconf 提示,并且配置脚本无法找到包含通用代码库的脚本。

我想知道为什么安装过程会有差异?有没有办法在通过 apt-get 安装时获得相同的顺序?所有三个文件都是 shell 脚本。

有没有更好的方法来处理这种可供各种维护者脚本使用的通用代码库?

答案1

任务已结束!

现在我理解了 debconf 手册页中描述的完整过程。有不同的阶段或步骤,无论您怎么称呼它。它们是:

  • dpkg-预配置
  • dpkg-i 命令
  • dpkg-重新配置

所有这些步骤都会启动 debconf 与用户的通信。当有人使用 dpkg -i 安装软件包时,配置脚本会在使用相同命令行选项运行 postinst 脚本之前运行。当 debconf 通信开始时,软件包已经解压。

当有人使用 apt-get 安装软件包时,首先会运行 dpkg-preconfigure 来执行配置脚本,然后运行 ​​dpkg -i 来实际安装该软件包,并再次运行相同的配置脚本。

在 apt-get 的第二种情况下,当配置脚本作为 dpkg-preconfigure 的一部分运行时,包尚未解压,所以我遇到了这个问题。

我刚刚添加了一个 if 条件,如果文件解压则继续,否则退出

if [ ! -f /usr/share/pkg-name/common-codebase ];
 then
    exit 0
 fi
 /usr/share/pkg/common-codebase

这样,在使用 apt-get 安装软件包时,dpkg-preconfigure 尝试运行配置脚本将被跳过,而 dpkg -i 的第二次尝试将被接受。这对我来说很有效,因为我向用户询问的 debconf 问题不会影响任何其他软件包。

如果您有共享模板,并且您的选择可能会影响软件包之外的任何内容,请记住,即使您延迟提示,apt-get 安装的其他相关/依赖软件包仍会在 dpkg-preconfigure 步骤中提示用户。在尝试此解决方案之前,请确保这对您来说没问题。

相关内容