如何在创建 .deb 安装程序时安装依赖项?

3
我创建了一个名为abc.deb的deb包。现在有一些依赖项,如python-dev、python-mysql等,需要作为deb安装的一部分安装。
也就是说,当用户运行dpkg -i abc.deb时,依赖关系应该自动安装。
我使用一个包含几个参数(如preinst、postinst等)的control文件。我尝试向控制文件添加Depends,但我想Depends只会在未安装指定的依赖项时停止软件包的安装。那么,如何将依赖项作为deb包的一部分安装?我正在寻找适用于Ubuntu 12.04的解决方案。
顺便说一下,当我尝试在我的postinst脚本中安装依赖项时:
sudo apt-get install python-dev -y

我遇到了一个错误:
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) 
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?`
3个回答

1

dpkg 只能安装单个软件包。

您应该在控制文件的 Depends 字段中声明所有软件包的依赖关系。

如果用户使用 dpkg -i package.deb 安装软件包,则会收到缺少依赖项的消息。然后,用户可以调用 apt-get -f install 从软件包存储库解决缺少的依赖关系(这假定您的依赖项实际上位于官方存储库中)。

另一种选择是使用诸如 gdebi 的工具安装软件包;gdebi 知道如何获取缺失的依赖项,使得 apt-get -f install 步骤不必要。

我的建议是将正确声明依赖关系的 package.deb 文件发送给用户,并建议他们使用 gdebi 安装。


1

你不能通过 dpkg 做到这一点;这正是 apt-get 的作用。如果在你的 .deb 控制文件中正确指定了依赖项,然后使用 apt-get 安装,它会自动为你安装它们。你不应该试图从较低级别的工具调用更高级别的工具。那时已经太晚了。


嗨 @BRPocock,非常感谢你的回复。如果我不想安装依赖项,但是希望让用户知道出现了什么错误,然后恢复已安装的软件包(即类似于 dpkg -r abc.deb 的有效方法,以保持我的 apt-get 清洁),该怎么办? - exAres
只需将它们列为依赖项。dpkg会给出一个信息性的错误;apt-get会提供安装它们的选项。用户决定是否这样做。 - BRPocock

0
我实现这个的方式是使用preinst脚本。该脚本在将该软件包从其Debian归档(".deb")文件中解压缩之前执行。
我在preinst脚本中检查依赖关系,如果没有发现依赖项,则退出并显示错误。以下示例 sh 代码展示了如何检查并安装不存在的依赖项:
  dpkg -s "python-pip" >/dev/null 2>&1 && {
    echo "python-pip is installed."
    echo
  } || {
    echo "ERROR: python-pip is not installed."
    //you may install python-pip here if you wish
  }

然后将此脚本提供给控制文件的Preinst:参数。


这是一个糟糕的建议。"preinst"钩子不应该安装其他软件包。软件包需要声明"Depends:"。 - Sigi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接