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
),退出代码是1
(echo $?
),但postinst
脚本没有执行。该软件可以在没有 UI 的情况下工作,所以这不是什么大问题(直到我创建两个单独的安装程序 - 一个带有 UI,另一个没有)。
问题是我的postinst
脚本中有一些重要的步骤,但它根本没有执行。
也许我需要某种回滚过程或处理此类错误的方法,但我无法找到任何方法来做到这一点,尽管这听起来微不足道。
另一种方法是执行所需的步骤后拆包和前依赖解析,但我也没有找到类似的东西。
显然,我在这里遗漏了一些基本的东西。有任何想法吗?
编辑:更重要的是,如果稍后出现丢失的软件包,则安装也不完整/损坏,因为postinst
从未实际执行过。因为这听起来很简单,我想有一个简单的解决方案,但我找不到。
答案1
你的postinst
如果包的依赖项不存在且未配置,将永远不会运行。你可以通过设置来作弊preinst
(尽管这发生在你的包解压之前),但我认为更好的方法是将你的 GUI 依赖项移至“推荐”。由于您的包可以在没有 UI 依赖项的情况下工作,因此它不应该依赖它们,而应该推荐它们;这将允许在包不存在时对其进行配置。