依赖关系和预先依赖关系之间有什么区别?

"Depends"和"Pre-Depends"在Ubuntu安装过程中指的是什么,以及这两种包要求之间的区别是什么?
2个回答

从这个链接中获取:https://www.debian.org/doc/debian-policy/#document-ch-relationships 有5种类型的依赖关系:
五个依赖字段的含义如下:

Depends

这声明了一个绝对的依赖关系。只有在其Depends字段中列出的所有软件包都被正确配置之后,才会配置该软件包。如果所依赖的软件包对于提供大量功能的依赖软件包是必需的,则应使用Depends字段。如果postinst或prerm脚本需要解压或配置所依赖的软件包才能运行,则还应使用Depends字段。在postinst configure的情况下,将首先解压和配置所依赖的软件包。
在prerm或其他postinst操作的情况下,软件包依赖关系通常至少已解压,但如果先前的依赖升级失败,则可能仅为“Half-Installed”。最后,如果所依赖的软件包在postrm脚本完全清理软件包移除后仍然需要,应使用Depends字段。不能保证在运行postrm时软件包依赖关系可用,但如果软件包声明了依赖关系(特别是在postrm remove的情况下),则所依赖的软件包更有可能可用。如果依赖关系不可用,postrm脚本必须优雅地跳过需要依赖关系的操作。

推荐

这表示一种强烈但不绝对的依赖关系。Recommends字段应列出与此软件包在除非特殊情况下都会一起安装的软件包。

Suggests

这用于声明一个软件包可能与一个或多个其他软件包更有用。使用此字段告诉打包系统和用户,所列出的软件包与此软件包相关,并且可能增强其实用性,但是在没有它们的情况下安装此软件包也是完全合理的。

Enhances

此字段类似于Suggests,但工作方向相反。它用于声明一个软件包可以增强另一个软件包的功能。

Pre-Depends

  • 这个字段类似于 Depends,但它还会强制 dpkg 在开始声明前的包安装之前完成命名包的安装。它的工作原理是这样的,当要解包一个声明了 pre-dependency 的包时,如果所依赖的包已经完全配置,或者即使所依赖的包只是解包或处于“Half-Configured”状态,只要它们在过去的某个时刻正确配置过(并且没有被移除或部分移除),pre-dependency 就能够满足。

  • 在这种情况下,先前配置过的版本和当前已解包或“Half-Configured”的版本都必须满足 Pre-Depends 字段中的任何版本限定条件。当要配置声明了 pre-dependency 的包时,pre-dependency 将被视为普通的 Depends。只有在所依赖的包已经正确配置的情况下,pre-dependency 才会被认为已满足。然而,与 Depends 不同,Pre-Depends 不允许打破循环依赖关系。如果在尝试满足 Pre-Depends 时遇到循环依赖关系,则安装将被中止。

  • 如果 preinst 脚本依赖于指定的包,则也需要使用 Pre-Depends。最好尽量避免出现这种情况。应该谨慎使用 Pre-Depends,最好只由可能会妨碍系统继续进行任何正在进行的升级的包来使用。

较小版本:

  • “depends”和“pre-depends”都是指在安装之前包需要的依赖关系,但“pre-depends”会强制先安装和配置依赖包,然后才开始处理需要这些依赖关系的包。在处理“pre-depends”之前,dpkg甚至不会解压主要包。而对于“depends”,依赖包和主要包的顺序并不重要。对于“pre-depends”,它会考虑到这一点,并且还会验证预依赖包是否已经配置和安装。如果没有这样做,主要包将不会被解压、配置或安装。在开始处理主要包之前,您必须先安装依赖项。如果没有安装,那么必须先下载/配置/安装它们,然后再继续。通常,在需要确保包的稳定性并且不会对系统或程序造成非常严重影响的情况下使用“pre-depends”,但在上面提到的链接中还有其他几个规范可以避免这些情况。

3请注意,还有一些反依赖关系,比如冲突(Conflicts)和中断(Breaks)。还有构建依赖关系,比如构建依赖(Build-Depends)。 - Alexis Wilke

术语“依赖关系”可以广泛地包括“Depends”和“Pre-Depends”关系(有时甚至包括其他较弱的关系),或者可以狭义地用作“Depends”的同义词。
“Depends”和“Pre-Depends”软件包之间的区别在于,如果X“依赖于”Y,则在X被配置之前,Y必须完全配置好。(配置是安装步骤,在此步骤中,一旦将软件包的文件解压到正确的位置(即“安装”),就会进行其他必要的更改,以便实际使用所提供的软件。例如,配置HTTP服务器可能涉及确保存在具有适当权限的“www”用户和具有适当权限的“/var/www”目录。)相反,如果X“预先依赖于”Y,则Y必须在X甚至被“安装”之前就已经安装并(通常)完全配置好。

请查看Debian政策手册7.2节以获取更多详细信息。我在此引用了两个最相关的部分,但该部分(以及第7章的其他内容)中还有其他信息可以帮助说明依赖关系的工作原理。


依赖
这声明了一个绝对的依赖关系。除非其“Depends”字段中列出的所有软件包都已正确配置(除非存在循环依赖关系,如上所述),否则不会配置软件包。
如果被依赖的软件包对于依赖软件包提供大量功能是必需的,则应使用“Depends”字段。
如果“postinst”或“prerm”脚本需要被依赖的软件包进行解压或配置以便运行,则还应使用“Depends”字段。在postinst configure的情况下,将首先解压和配置被依赖的软件包。(如果两个软件包都涉及依赖循环,可能无法按预期工作;请参阅前面几段的解释。)在prerm或其他postinst操作的情况下,软件包依赖关系通常至少会被解压,但如果之前的依赖升级失败,则它们可能只处于“Half-Installed”状态。
最后,如果被依赖的软件包在postrm脚本中需要完全清理软件包删除后的内容,则应使用“Depends”字段。不能保证在运行postrm时软件包依赖关系可用,但如果软件包声明了依赖关系(特别是在postrm remove的情况下),则被依赖的软件包更有可能可用。如果依赖关系不可用,postrm脚本必须优雅地跳过需要依赖关系的操作。

Pre-Depends

这个字段类似于Depends,但它还会强制dpkg在开始安装声明了预先依赖的软件包之前,完成对先前命名的软件包的安装,具体如下:

当一个声明了预先依赖的软件包即将被解压缩时,如果所依赖的软件包已经完全配置,或者即使所依赖的软件包只是被解压缩或处于“半配置”状态,只要它们在过去的某个时间点上已经正确配置过(并且没有被删除或部分删除),那么预先依赖可以得到满足。在这种情况下,先前配置的版本和当前解压缩或“半配置”的版本都必须满足Pre-Depends字段中的任何版本条件。

当声明了预先依赖的软件包即将被配置时,预先依赖将被视为普通的Depends。只有在所依赖的软件包已经正确配置的情况下,才会认为预先依赖得到满足。然而,与Depends不同,Pre-Depends不允许打破循环依赖。如果在尝试满足Pre-Depends时遇到循环依赖,安装将被中止。

如果preinst脚本依赖于指定的软件包,则还需要Pre-Depends。最好尽量避免这种情况的发生。

应该谨慎使用Pre-Depends,最好只由那些过早升级或安装可能妨碍系统继续进行任何可能正在进行的升级的软件包使用。

在未经debian-devel邮件列表讨论并达成一致意见之前,不应为软件包指定Pre-Depends条目。请参阅Dependencies, Section 3.5