gdebi与dpkg:gdebi如何自动获取缺失的依赖项?我能否将gdebi用于所有其他.deb软件包的安装?

最近我碰巧重新安装了我的Ubuntu,改成了Lubuntu 15.04。所以我在寻找Skype的安装方法时找到了这个不错的教程。
真的很酷。它从这里下载了Skype的官方deb包。
由于我还没有安装gdebi,所以我使用sudo su -c apt-get install gdebi命令进行了安装。
然后使用gdebi命令sudo su -c gdebi skype-ubuntu*4*.deb安装了skype-ubuntu-precise_4.3.0.37-1_i386.deb。
哇,gdebi为我做了一切,真是一个无忧无虑的事情,而不需要使用传统的Apt PPA手动添加链接,这可能会破坏我的系统更新/软件安装。
但是如果我尝试使用dpkg -i来安装它。
dpkg -i skype-ubuntu-precise_4.3.0.37-1_i386.deb
Selecting previously unselected package skype.
(Reading database ... 86449 files and directories currently installed.)
Preparing to unpack skype-ubuntu-precise_4.3.0.37-1_i386.deb ...
Unpacking skype (4.3.0.37-1) ...
dpkg: dependency problems prevent configuration of skype:
 skype depends on libc6 (>= 2.3.6-6~).
 skype depends on libc6 (>= 2.7).
 skype depends on libgcc1 (>= 1:4.1.1).
 skype depends on libqt4-dbus (>= 4:4.5.3).
 skype depends on libqt4-network (>= 4:4.8.0).
 skype depends on libqt4-xml (>= 4:4.5.3).
 skype depends on libqtcore4 (>= 4:4.7.0~beta1).
 skype depends on libqtgui4 (>= 4:4.8.0).
 skype depends on libqtwebkit4 (>= 2.2~2011week36).
 skype depends on libstdc++6 (>= 4.2.1).
 skype depends on libx11-6.
 skype depends on libxext6.
 skype depends on libxss1.
 skype depends on libxv1.
 skype depends on libssl1.0.0.
 skype depends on libpulse0.
 skype depends on libasound2-plugins.

dpkg: error processing package skype (--install):
 dependency problems - leaving unconfigured
Processing triggers for hicolor-icon-theme (0.13-1) ...
Processing triggers for mime-support (3.55ubuntu1.1) ...
Processing triggers for desktop-file-utils (0.22-1ubuntu2) ...
Processing triggers for dbus (1.8.8-1ubuntu2.1) ...
Errors were encountered while processing:
 skype

太多的依赖问题。哦,我刚刚谷歌了一下GDebi,维基百科上有这样的介绍:
GDebi是一个APT工具,可以在命令行和图形界面上使用。GDebi可以通过命令行安装本地的.deb文件,就像dpkg命令一样,但是它可以访问存储库来解决依赖关系。
我的疑问是:
(1)GDebi如何在不手动添加Apt PPA链接到配置文件的情况下安装带有依赖关系的.deb包?
(2)我能否使用相同的GDebi命令(sudo su -c gdebi my.deb)来安装其他所有的.deb包,而无需添加Apt PPA,或者我必须更改格式,例如:sudo su -c my*n*.deb,其中n是软件的版本等?
请用通俗易懂的语言解释,以便我能够理解。

4请注意,现在我会说gdebi已经过时了,因为apt可以从本地文件进行安装。为了让它将参数识别为本地文件,只需在路径前加上.//即可。所以,例如,你需要将sudo apt install my_file.deb更改为sudo apt install ./my_file.deb - Hi-Angel
3个回答

实际上,gdebi只是一个前端界面,用于增强dpkg的功能。它可以在软件仓库中检查依赖包,并在一次操作中安装它们,而dpkg -i需要手动进行两个操作(后续操作为apt-get -f install)。 问题1:

1)gdebi如何做到这一点?在不使用手动添加配置文件中的Apt PPA链接的情况下,安装带有依赖关系的.deb软件包?

作为dpkg的前端界面,它可以使用dpkg的所有功能。由于每个.deb软件包文件都包含有关该deb文件的元数据(例如软件包名称、维护者、依赖关系等),因此它可以轻松地检查该文件的依赖关系。 例如,您可以使用dpkg --info package-name.deb来检查.deb文件的元数据 然后,它使用这些信息构建依赖关系图,并将本地可用的.deb文件标记为已下载,并从互联网下载其他.deb文件。
请注意,那些需要额外软件包的必须在系统中配置的至少一个仓库中可用(具有正确的版本)。
然后它会像普通的apt安装一样进行。不同之处在于它不会重新下载主要的.deb文件。
问题2:
(2)我可以使用相同的gdebi命令(sudo su -c gdebi my.deb)来安装所有其他deb软件包而不添加PPA吗?还是我必须更改格式sudo su -c myn.deb,其中n是软件版本等?
PPA存在是有原因的。主要原因是它们提供最新版本的软件包。而这些高版本的软件包通常也依赖于更高版本的子软件包,这些子软件包通常也是从PPA而不是标准的Ubuntu仓库中获取的。
示例场景:
假设一个名为"mother-package"的包在标准Ubuntu软件源中具有最高版本2.0,并且这个"mother-package"依赖于一个名为"child-package"的版本为2的包。还假设某个PPA提供了需要"child-package"版本3的"mother-package"版本3.0,两者都可以通过该PPA仓库获取。
问题是,如果你现在从仓库页面下载"mother-package-3.0.deb"并尝试使用"gdebi"进行安装,你(或"gdebi")将会失败。
因为,检查mother-package-3.0.deb文件时,gdebi知道这个mother-package需要版本为3.0或更高的child-package,但它只知道版本2.0的位置。它不知道从哪里获取版本为3.0child-package。这是可以预料的,因为您没有告诉系统您从哪里获取这个最新的mother-package。换句话说,您没有配置repository list以包括该PPA。
所以,这个问题的明显答案是取决于情况如果必要的依赖关系已经在配置好的存储库中找到,安装将成功进行。但如果没有,那么安装这个更高版本的软件包将失败。这就是为什么您仍然需要PPA,并且这是最简单的方法,而不是手动完成所有这些步骤。 第二个问题的第二部分对我来说没有意义

我在几个应用程序中遇到了同样的问题,其中包括Skype,这些应用程序依赖于需要手动安装的外部软件包或库文件。
为了解决这个问题,我使用了以下方法:
sudo dpkg -i skype.deb

然后在被提示输入外部库的时候,就像你在输出中看到的那样,我输入了:
sudo apt-get install -f

这个自己下载了所需的软件包并安装了Skype。

在每个 .deb 包中都有一个依赖列表(带有兼容版本号)。
我不是 Python 的读者,但源代码似乎调用了 "apt" 来获取该列表。很明显,它必须递归地遍历以查找依赖项的依赖项,但 "apt" 也可以做到这一点。
一旦所有依赖关系都确定并按正确顺序放置(某些依赖项需要在其他依赖项之前安装),只需简单地要求 "apt" 安装这些依赖项。然后将作为 Gdebi 参数给出的软件包安装。
依赖项和目标软件包分两次进行安装有两个原因。首先,安装本地 .deb 文件的 apt 调用格式与从存储库安装依赖项的 apt 调用格式不同。其次,分开调用确保依赖项在目标软件包之前全部安装完毕。