如何处理 deb 软件包安装过程中失败的依赖项(使用 dpkg)

如何处理 deb 软件包安装过程中失败的依赖项(使用 dpkg)

TL;博士;

如果有人使用deb来安装我的软件包sudo dpkg -i example.deb,有没有办法添加一些自定义操作(shell 命令,类似于postinst),以防依赖项安装失败(因为软件包实际上已解压并存在于目标计算机上)?


假设一个deb包有一些 UI 依赖项,但目标机器是 Ubuntu 服务器。
跑步sudo dpkg -i example.deb会导致

(Reading database ... 59708 files and directories currently installed.)
Preparing to unpack ./example.deb ...
Unpacking example (13) over (11) ...
dpkg: dependency problems prevent configuration of example:
 example depends on libappindicator1; however:
  Package libappindicator1 is not installed.

dpkg: error processing package example (--install):
 dependency problems - leaving unconfigured
Processing triggers for mime-support (3.64ubuntu1) ...
Errors were encountered while processing:
 example

结果是 - 提取的包(我可以在 中找到内容/opt),退出代码是1echo $?),但postinst脚本没有执行。该软件可以在没有 UI 的情况下工作,所以这不是什么大问题(直到我创建两个单独的安装程序 - 一个带有 UI,另一个没有)。

问题是我的postinst脚本中有一些重要的步骤,但它根本没有执行。

也许我需要某种回滚过程或处理此类错误的方法,但我无法找到任何方法来做到这一点,尽管这听起来微不足道。

另一种方法是执行所需的步骤拆包和依赖解析,但我也没有找到类似的东西。

显然,我在这里遗漏了一些基本的东西。有任何想法吗?


编辑:更重要的是,如果稍后出现丢失的软件包,则安装也不完整/损坏,因为postinst从未实际执行过。因为这听起来很简单,我想有一个简单的解决方案,但我找不到。

答案1

你的postinst如果包的依赖项不存在且未配置,将永远不会运行。你可以通过设置来作弊preinst(尽管这发生在你的包解压之前),但我认为更好的方法是将你的 GUI 依赖项移至“推荐”。由于您的包可以在没有 UI 依赖项的情况下工作,因此它不应该依赖它们,而应该推荐它们;这将允许在包不存在时对其进行配置。

相关内容