依靠

依靠

当我在 Ubuntu 中安装某些东西时,“依赖”和“预依赖”是什么意思,这两种类型的包要求有什么区别?

答案1

摘自此链接:https://www.debian.org/doc/debian-policy/#document-ch-relationships

依赖关系有 5 种类型:

五个依赖字段含义如下:

依靠

  • 这声明了绝对依赖关系。除非已正确配置了 Depends 字段中列出的所有包,否则不会配置包。如果依赖包需要依赖包才能提供大量功能,则应使用 Depends 字段。如果 postinst 或 prerm 脚本需要解压或配置依赖包才能运行,也应使用 Depends 字段。在 postinst configure 的情况下,将首先解压和配置依赖包。

  • 对于 prerm 或其他 postinst 操作,软件包依赖项通常至少会被解压,但如果依赖项的先前升级失败,则它们可能仅“安装一半”。最后,如果 postrm 脚本在软件包删除后需要依赖的软件包来完全清理,则应使用 Depends 字段。无法保证在运行 postrm 时软件包依赖项可用,但如果软件包声明了依赖项(特别是在 postrm remove 的情况下),则依赖的软件包更有可能可用。如果依赖项不可用,postrm 脚本必须优雅地跳过需要依赖项的操作。

建议

  • 这声明了强依赖性,但不是绝对依赖性。推荐字段应列出在所有安装中(除了不寻常的安装)都会与此软件包一起找到的软件包。

建议

  • 这用于声明一个软件包与一个或多个其他软件包一起使用时可能更有用。使用此字段可以告诉包装系统和用户列出的软件包与此软件包相关,并且可能增强其实用性,但是不安装这些软件包安装此软件包也是完全合理的。

增强

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

预先依赖

  • 此字段与 Depends 类似,不同之处在于它还强制 dpkg 在开始安装声明预依赖的软件包之前完成命名软件包的安装, 它的工作原理是这样的,当一个声明预依赖的包即将被解压时,如果所依赖的包已经完全配置,那么预依赖就可以得到满足,或者即使所依赖的包只是解压或处于“半配置”状态,只要它们在过去的某个时间点已经正确配置(并且从那时起没有被删除或部分删除)。

  • 在这种情况下,先前配置的版本和当前解压的版本或“半配置”版本都必须满足 Pre-Depends 字段中的任何版本子句。当声明预依赖项的包即将配置时,预依赖项将被视为普通的 Depends。只有依赖的包已正确配置,才会被视为已满足。但是,与 Depends 不同,Pre-Depends 不允许中断循环依赖。如果在尝试遵守 Pre-Depends 时遇到循环依赖,则安装将中止。

  • 如果 preinst 脚本依赖于指定包,则也需要 Pre-Depends。最好尽可能避免这种情况。Pre-Depends 应谨慎使用,最好仅用于那些过早升级或安装会妨碍系统继续进行任何可能正在进行的升级的包。

较小版本:

  • 两个都依靠预先依赖在安装之前提到包所需的依赖项,但预依赖项会在开始使用需要依赖项的包之前强制安装和配置依赖包。 dpkg 甚至不会解压主包,直到处理完所有预依赖包。 使用依赖项时,依赖包和主包的顺序并不重要。 使用预依赖项时,它会考虑到这一点,还会验证预依赖包是否已配置和安装。 没有这个,主包甚至不会被解压、配置或安装。 您必须在开始使用主包之前安装依赖项。 如果没有,则必须先下载/配置/安装它们,然后才能继续。 预依赖项通常用于包的稳定性很重要并且不会以非常糟糕的方式影响系统或程序的情况,但这种情况可以通过上面链接中提到的几种规范来避免。

答案2

术语“依赖”可广泛用于包含“依赖”和“预依赖”关系(有时甚至包括其他更弱的关系),或可狭义地用作“依赖”的同义词。

“依赖”和“预依赖”包关系之间的区别在于,如果 X依靠在 Y 上,那么 Y 必须在配置 X 之前完全配置。(配置是安装步骤,一旦软件包的文件被解压到正确的位置 - 即“安装” - 就会进行其他必要的更改,以便可以实际使用它提供的软件。例如,HTTP 服务器的配置可能涉及确保有具有www适当能力的用户和/var/www具有适当权限的目录。)相反,如果 X预先依赖那么 Y 必须在 X 之前安装并(通常)完全配置已安装

Debian 政策手册第 7.2 节了解更多详细信息。我在这里引用了两个最相关的部分,但该部分(以及第 7 章中更广泛)中还有其他信息有助于阐明依赖关系的工作原理。


Depends

这声明了绝对依赖关系。除非字段中列出的所有包都已正确配置,否则不会配置包Depends(除非存在如上所述的循环依赖关系)。

Depends如果依赖包需要依赖包来提供大量功能,则应该使用该字段。

如果或脚本需要解压或配置依赖的包才能运行,Depends也应使用此字段。在 postinst configure 的情况下,将首先解压和配置依赖的包。(如果两个包都涉及依赖循环,则可能无法按预期工作;请参阅前面几段的解释。)在或其他操作的情况下,包依赖项通常至少会被解压,但如果依赖项的先前升级失败,则它们可能只是“半安装”。postinstprermprermpostinst

最后,Depends如果脚本在删除软件包后需要完全清理所依赖的软件包,则应使用该字段postrm。无法保证软件包依赖项在postrm运行时可用,但如果软件包声明了依赖项(尤其是在 的情况下),则所依赖的软件包更有可能可用postrm removepostrm如果依赖项不可用,则脚本必须优雅地跳过需要依赖项的操作。


Pre-Depends

该字段与 类似Depends,不同之处在于它还会dpkg在开始安装声明预依赖项的包之前强制完成所命名包的安装,如下所示:

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

当声明预依赖的包即将被配置,预依赖将被视为正常Depends。仅当依赖的包已正确配置时,才会认为已满足。但是,与 不同DependsPre-Depends不允许中断循环依赖。如果在尝试遵守 时遇到循环依赖Pre-Depends,则安装将中止。

Pre-Depends如果脚本依赖于指定的包,则也需要preinst。最好尽可能避免这种情况。

Pre-Depends应谨慎使用,最好仅用于那些过早升级或安装会妨碍系统继续进行正在进行的升级的软件包。

Pre-Depends在邮件列表中讨论debian-devel并达成共识之前,您不应为包指定条目。请参阅依赖项,第 3.5 节

相关内容