依赖和预依赖有什么区别?

Bru*_*ira 20 package-management packaging apt dpkg dependencies

“depends”和“pre-depends”是什么意思,当我在 Ubuntu 中安装某些东西时,这两种类型的包要求之间的区别是什么?

Lui*_*ado 29

取自此链接: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 脚本必须优雅地跳过需要依赖项的操作。

推荐

  • 这声明了一个强但不是绝对的依赖。Recommends 字段应该列出除了不寻常的安装之外的所有软件包都可以与此软件包一起找到。

建议

  • 这用于声明一个包可能对一个或多个其他包更有用。使用这个字段告诉打包系统和用户,列出的包与这个包相关,也许可以增强它的实用性,但是安装这个没有它们的包是完全合理的。

增强

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

预先依赖

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

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

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

较小的版本:

  • 这两个依赖预依赖在安装之前提及包需要的依赖项,但 pre-depends 甚至在启动需要依赖项的包之前强制安装和配置依赖包。dpkg 甚至不会解压主包,直到所有的依赖包都被处理完。对于depends,依赖包和主包的顺序并不重要。对于 pre-depends,它会考虑到这一点,并验证是否配置和安装了 pre-depends 包。没有这个,主包甚至不会被解压、配置或安装。在开始使用主包的过程之前,您必须安装依赖项。如果没有,则必须先下载/配置/安装它们,然后才能继续。

  • 请注意,还有 _anti-dependencies_,例如 Conflicts 和 Breaks。并构建依赖项,例如 Build-Depends。 (3认同)

Eli*_*gan 5

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

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

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


Depends

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

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

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

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


Pre-Depends

该字段类似于Depends,除了它还强制dpkg在开始安装声明预依赖的包之前完成指定的包的安装,如下所示:

当一个声明预依赖的包即将被解包时,如果依赖包被完全配置,或者即使依赖包只是被解包或在“半-Configured”状态,前提是它们在过去的某个时间点已正确配置(并且此后未删除或部分删除)。在这种情况下,先前配置的和当前未打包的或“半配置”版本都必须满足该Pre-Depends字段中的任何版本子句。

当声明预依赖的包即将被配置时,预依赖将被视为正常的Depends。只有正确配置了依赖包才会被认为是满意的。但是,与 with 不同DependsPre-Depends不允许破坏循环依赖。如果在尝试执行时遇到循环依赖Pre-Depends,安装将中止。

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

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

Pre-Dependsdebian-devel邮件列表中对此进行讨论并就这样做达成共识之前,您不应为包指定条目。参见依赖关系,第 3.5 节