如何让`dpkg -i`为我安装依赖项?

嘿,我有一个名为foo-1.2.3.deb的文件,它依赖于perlpython。然而,运行以下命令:
dpkg -i ./foo-1.2.3.deb

无法安装这些依赖项。所以我必须手动执行apt-get install perl python

如何让dpkg -i自动为我安装这些依赖项?


11@pd12:好耶,循环引用万岁!😄 - David Foerster
1嘿,我决定把两者都链接起来,看看版主会选择哪一个。 - pd12
5令人惊讶的是,在2016年,一个.deb图形化安装程序仍然会在缺少依赖项时默默失败,而不告诉用户任何信息。 - Dan Dascalescu
这取决于你是否输入了密码或者配置了你的操作系统不要求脚本输入密码。无论如何,你有捕获脚本的输出吗? - Melebius
@Melebius 输出看起来正常。当我执行它时,它会要求我输入密码。在输入密码后,脚本中的所有sudo apt install都将被执行,没有任何错误。 - Yves
1首段请参考https://askubuntu.com/questions/794983/where-are-packages-stored-installed-with-apt-in-ubuntu-16-04,至于问题的其余部分,最好从https://askubuntu.com/questions/974/how-can-i-install-software-or-packages-without-internet-offline中寻找解决方案。 - muru
我猜所有的答案都取决于你的操作系统版本的软件仓库是否存在未满足的依赖关系,而我的操作系统版本并没有这个问题。 - Sridhar Sarnobat
12个回答

使用dpkg后,运行以下命令帮助我安装所需的依赖项:
sudo apt-get -f install

总的来说,您的终端应该是这样的:
$ sudo dpkg -i package_with_unsatisfied_dependencies.deb
dpkg: dependency problems prevent ... 
[additional messages]

$ sudo apt-get -f install
[apt messages]
Setting up [dependency]...
Setting up package_with_unsatisfied_dependencies...

请注意关于“设置package_with_unsatisfied_dependencies”的那一行。这个修复(并完成)了安装package_with_unsatisfied_dependencies.deb的过程。

20我需要再次运行 sudo dpkg -i mypackage.deb 吗? - Muhammad Gelbana
50运行sudo apt-get -f install后,我的软件包及其依赖项都已安装。再次运行sudo dpkg -i my_package.deb是不必要的,只会再次安装该软件包。 - Gus E
8在Ubuntu 14.04上,以下操作适用:sudo dpkg -i package.deb; sudo apt-get -f install; sudo dpkg -i package.deb。第一次运行dpkg -i命令会标记依赖项,apt-get -f install命令会安装所需的依赖项,第二次运行dpkg -i命令会成功安装软件包。请注意,apt-get install -f是完全不同的命令。 - Mikko Rantalainen
2@ysth 不要执行 dpkg -i --force,那样会强制安装一个损坏的软件包!运行 dpkg 时不要加上 --force 参数,这样会在软件包数据库中创建必要的条目,以便 apt-get -f install 可以正确处理。 - Brian A. Henning
@Lotharyx:我现在无法尝试,但我认为没有使用强制选项的dpkg(由于缺少依赖项而失败)不会在软件包数据库中创建条目。 - ysth
@ysth 是的,它确实有效。我已经尝试过了。但结果可能因人而异。 - Brian A. Henning
@MikkoRantalainen,apt-get -f installapt-get install -f真的有区别吗?这里说它们是一样的。 - Arch Stanton
如果我没有安装apt-get怎么办?我需要仅依靠dpkg来解决依赖关系。 - moth
-f代表--fix-broken - Константин Ван

从apt 1.1开始(适用于Xenial(16.04),stretch),apt install还允许使用本地文件:
sudo apt install ./foo-1.2.3.deb

简单而清晰得多。

请查看发布公告


7对于未满足的依赖项,请按照 apt 指示使用 --fix-broken - qwr
sudo apt -f install ./foo-1.2.3.deb - David Winiecki

你可以安装gdebi-core,它是GDebi软件包安装程序的命令行版本,适用于10.04及之前的版本。在新版本的Ubuntu中,使用软件中心来安装deb包,但没有相应的命令行等价物。
要使用gdebi安装deb包,只需运行以下命令:
sudo gdebi my_package_1.0.deb

1这可能是这里最好的答案之一。 - MarkSkayff
如果你有debian/control文件,还有一个叫做mk-build-deps的工具可以使用。 - phoxd

Gdebi

gdebi安装deb软件包及其依赖项。要使用它,请运行:

sudo gdebi package.deb

在新版本的Ubuntu中,它不是默认安装的,因此您需要从软件源中进行安装。
请参阅man gdebi以获取完整的选项列表。 gdebi是与以前默认包含在Ubuntu中同名的图形工具相当的命令行等效工具。图形工具的命令是gdebi-gtk,并具有类似的功能:

gdebi-gtk


gdebi-gtk不会显示所需的依赖项(至少是我这里的版本,并且看起来像是一个错误),但命令行可以!如果我们有另一台安装了这些软件包的机器,我们可以根据这些依赖项列表使用dpkg-repack来重新打包它们 :) - Aquarius Power

跑步

sudo apt-get install -f

安装dpkg软件包可能会解决损坏的依赖关系(至少apt-get命令这样说...)。我会在检查后更新。

1我应该再次运行 sudo dpkg -i mypackage.deb 吗? - Muhammad Gelbana
3apt-get -f install 可以正常工作,但 apt-get install -f 不是同样的意思。 - 200_success

如果您需要运行一个命令,自动解决所有.deb文件的依赖关系并使用同一命令安装.deb文件及其缺失的依赖关系,您需要使用sudo apt update更新已安装的软件。然后打开终端,使用cd命令更改目录到包含package-name.deb的目录,并输入以下命令:
apt install --simulate ./package-name.deb # 这个命令不需要sudo权限。
其中package-name.deb应替换为您要安装的位于当前目录中的.deb文件的名称。
上述命令不会安装任何东西,但它会打印一个消息,列出package-name.deb的任何依赖项在默认的Ubuntu存储库中不存在。您需要手动下载和安装这些缺失依赖包的.deb文件,以便安装package-name.deb。在安装任何这些手动下载的依赖包之前,运行apt install --simulate ./manually-downloaded-package.deb来检查这些包是否有任何未满足的依赖关系。
如果模拟命令成功完成,请运行以下命令来安装package-name.deb。
sudo apt install ./package-name.deb
如果所有的.deb文件都位于当前目录中,那么在同一条命令中可以有多个.deb文件。
sudo apt install ./package-name-1.deb ./package-name-2.deb

dpkg没有依赖支持。有一种方法可以绕过这个问题,但这需要你创建一个本地数据库(因此你已经知道了依赖关系),而且它被认为是过时的(...)。
必须使用命令行吗?(服务器安装?)如果是这样,还可以尝试一下apt-get -f,但要小心:在安装后解决依赖关系可能会导致系统损坏。 gdebi(图形界面前端)曾经能够做到这一点,但现在已被USC取代。
你是如何下载.deb文件的?一些新的11.04功能是处理从网站下载的.deb文件:它会在USC中打开,所以安装程序会解决依赖关系。
根据andrew的评论进行编辑: sudo gdebi foo-1.2.3.deb 就可以解决问题了!

1gdebi仍然可以用于这个。软件中心现在只是默认应用程序。此外,正如陈小龙指出的那样,gdebi也可以在命令行上使用。 - andrewsomething
酷!那么问题就有了答案,因为似乎也可以在命令行上使用gdebi。 - Rinzwind
这应该是被接受的答案。 - prosti

你可以创建一个名为 dpkg-dep-inst 的文件,其内容如下。
#!/bin/bash

DEBIAN_FILE1=$1
dpkg -i $DEBIAN_FILE1 || apt-get --fix-broken install

我假设你在你的主文件夹中创建了这个文件。使用chmod +x dpkg-dep-inst命令将其设置为可执行文件,并使用sudo cp dpkg-dep-inst /usr/local/bin命令将其移动到/usr/local/bin目录下。
现在,你可以使用以下命令自动安装带有依赖关系的Debian软件包:
sudo dpkg-dep-inst foo-1.2.3.deb

2使用apt-get --yes --fix-broken install命令,并使修复过程自动化。 - Lucas
1不,一般情况下不是这样的。 - BuZZ-dEE

作为对的替代,您可以使用Ubuntu软件中心。
双击该软件包,应该会出现一个安装按钮。

我刚遇到了这个问题。调用apt-get install -f不会安装推荐的依赖项!唯一的解决方法是创建一个本地仓库并添加到/etc/apt/sources.list中,例如:
apt-ftparchive packages . > Packages && gzip < Packages > Packages.gz
sudo echo "deb file://$PWD /" >> /etc/apt/sources.list
sudo apt-get update