创建 .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 安装程序时如何安装依赖项?的主要内容,如果未能解决你的问题,请参考以下文章