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

Installation 如何在创建.deb安装程序时安装依赖项?,installation,controls,deb,build-dependencies,post-install,Installation,Controls,Deb,Build Dependencies,Post Install,我已经创建了一个deb包,比如abc.deb。现在有一些依赖项,如pythondev、pythonmysql等,需要作为deb安装本身的一部分进行安装 (即,当用户运行dpkg-i abc.deb时,依赖项也应自动安装) 我正在使用一个控件文件,该文件包含很少的参数,如preinst、postinst等。我试图将依赖项添加到控件文件中,但我猜,依赖项仅在不存在所提到的依赖项时停止包安装。如何将依赖项作为deb包安装本身的一部分进行安装?我正在寻找一个能在Ubuntu 12.04上运行的解决方案

我已经创建了一个
deb
包,比如
abc.deb
。现在有一些依赖项,如
pythondev、pythonmysql
等,需要作为deb安装本身的一部分进行安装

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

我正在使用一个
控件
文件,该文件包含很少的参数,如
preinst、postinst
等。我试图将
依赖项
添加到控件文件中,但我猜,
依赖项
仅在不存在所提到的依赖项时停止包安装。如何将依赖项作为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?`

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

我实现这一点的方法是使用
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:
参数。

dpkg
只能安装单个软件包

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

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

另一种方法是使用
gdebi
等工具安装软件包
gdebi
知道如何获取缺少的依赖项,因此不需要执行apt get-f install
步骤


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

Hi@BRPocock安装它,非常感谢您的回复。如果我不想安装依赖项,但想让用户知道错误是什么,然后恢复已安装的软件包(即对
dpkg-r abc.deb有效的东西,以便我的apt get保持干净),该怎么办?只需将它们列为依赖项即可
dpkg
将给出信息性错误<代码>apt get
将提供安装它们的服务。用户决定是否这样做。这是错误的建议。“preinst”钩子不应该安装其他软件包。包需要声明
依赖项: