我正在创建一个 Debian 软件包,其中有一些在官方存储库中找不到的依赖项。简单地将这些其他包指定为依赖项并不能解决问题,因为它们的安装本身就涉及运行 apt-get update 并将源存储库(不是我的)添加到 /etc/apt/sources.list.d。
更多的:这些软件包之一是 Dart 语言 SDK - 您只能通过获取其 deb 并使用 dpkg 或添加 Google 的存储库之一来安装它。我的目标实际上只是在最大限度地减少软件包安装中涉及的步骤数和干净的软件包部署之间找到平衡。
因此,我希望我的软件包的预安装脚本添加这些源,然后运行 apt-get update,但主要问题是当软件包打开并安装时,它会锁定 dpkg。那么是否有可能直接实现我想要的目标,或者还有哪些其他选项/解决方法?
答案1
我认为直接不可能。
但不知何故,用户安装了您的软件包,而且显然不是从您的存储库中安装的,因为它尚未添加。因此,我建议的第一个解决方法是以正常方式执行操作:让用户添加存储库(或为用户提供一个简单的 shell 脚本),然后正常安装包。这将是我的首选解决方案,运行 shell 脚本并不比安装包困难。
第二种解决方法:让您的包只是一个安装包。让它设置您的存储库,然后告诉用户(例如,通过 debconf 注释或屏幕上的其他提示)安装真正的包(它将来自您的存储库)。
第三种解决方法:相同的安装包,但在存储库中使用相同的包名称,只是更高的版本(可能使用纪元)。因此,初始安装将设置存储库,然后apt upgrade
或类似的操作将拉入真正的包。
第四:我不确定这是一个好主意,但是 - 在您的 postinst 中,启动一个等待 dpkg 锁的后台进程,然后完成安装。我认为at
orbatch
会为此工作,或者只是一个普通的/path/to/script &
后跟disown
.您可能想让用户知道软件包安装将在后台完成。
PS:您可能还需要添加 GPG 密钥。