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

Posted

技术标签:

【中文标题】创建 .deb 安装程序时如何安装依赖项?【英文标题】:How to install dependencies while creating a .deb installer? 【发布时间】:2014-05-19 09:11:24 【问题描述】:

我创建了一个deb 包,比如abc.deb。现在很少有像python-dev, python-mysql 之类的依赖项,需要作为 deb 安装本身的一部分进行安装。

(即当用户运行dpkg -i abc.deb 时,依赖项也应该自动安装)。

我正在使用一个control 文件,其中包含一些参数,例如preinst, postinst 等。我尝试将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?`

【问题讨论】:

【参考方案1】:

dpkg 只能安装单个包。

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

如果您的用户随后使用dpkg -i package.deb 安装该软件包,他们将收到一条缺少依赖项的消息。然后,用户可以调用apt-get -f install 来修复包存储库中缺少的依赖项(这假设您的依赖项实际上官方存储库中)。

另一种方法是使用诸如gdebi 之类的工具来安装您的包; gdebi 知道如何获取缺失的依赖项,因此不需要 apt-get -f install 步骤。

我的建议是将您的 package.deb 文件(带有适当的依赖声明)发送给您的用户,并建议他们使用 gdebi 安装它。

【讨论】:

【参考方案2】:

我实现这一点的方法是使用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:【参考方案3】:

您无法通过dpkg 执行此操作;这就是apt-get 的用途。如果您在.deb 控制文件中正确指定依赖项,然后使用apt-get 安装,它将自动为您安装它们。您不应该尝试从较低级别的工具调用较高级别的工具。到那时,为时已晚。

【讨论】:

嗨@BRPocock,非常感谢您的回复。如果我不想安装依赖项,但想让用户知道错误是什么,然后恢复已安装的包(即对dpkg -r abc.deb 有效的东西,以便我的 apt-get 保持干净)怎么办? 只需将它们列为依赖项即可。 dpkg 将给出信息错误; apt-get 将提供安装它们。用户决定是否这样做。

以上是关于创建 .deb 安装程序时如何安装依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建具有基本依赖项的 deb 包?

如何将 .deb 的所有依赖项放到磁盘上?

如何列出/下载 debian 包的递归依赖项?

如何声明对 .deb 包的非 .deb 二进制依赖?

Ubuntu下如何安装.deb文件?

Ubuntu软件系列---如何安装deb安装包