1

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

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

当我将文件放在 APT 存储库中时,当我使用 apt-get 安装时,相同的过程会颠倒过来。该包没有先解包,而是显示 debconf 提示,并且配置脚本无法找到包含通用代码库的脚本。

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

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

4

1 回答 1

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 步骤中提示用户。在尝试此解决方案之前,请确保这适合您。

于 2014-10-20T07:21:27.060 回答