AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1508011
Accepted
charmoniumQ
charmoniumQ
Asked: 2024-03-20 04:02:33 +0800 CST2024-03-20 04:02:33 +0800 CST 2024-03-20 04:02:33 +0800 CST

APT 使用什么依赖性解析器?

  • 772

我注意到包的元数据(例如git)中有版本限制。APT 使用什么算法来满足这些依赖关系?

例如,Spack使用Clingo作为其依赖项求解器,Conda 和 Mamba 使用libsolv,Pip使用自己的自定义回溯求解器。

apt
  • 1 1 个回答
  • 383 Views

1 个回答

  • Voted
  1. Best Answer
    Jörg W Mittag
    2024-03-20T04:58:30+08:002024-03-20T04:58:30+08:00

    APT 早于依赖性解析的想法,它是系统的一个有趣的属性,可以独立于执行依赖性解析的程序进行研究,因此 APT 的依赖性解析算法基本上是:“无论APT 的源代码发生了什么”。

    特别是,APT 是第一个提供依赖性解析的包管理器,因此没有理由独立于 APT 讨论其算法,例如将其与 RPM 进行比较,因为 RPM 没有有依赖解析。

    当然,现在 APT 的开发者不仅仅是随机编码的,但我的观点是:该算法没有名称,因为在当时,它是唯一的,所以没有理由谈论算法而不谈论APT,反之亦然。

    自述文件部分中有一些关于调试的信息:

    依赖解析

    APT 在其内部解析器中分两个阶段工作:首先访问所有包并标记为安装、保留或删除。选项Debug::pkgDepCache::Marker显示了这一点。这也决定了要安装哪些包来满足依赖关系,这可以通过Debug::pkgDepCache::AutoInstall. 完成此操作后,我们可能会遇到这样的情况:想要安装两个包,但只能安装其中一个。的工作是pkgProblemResolver决定两个包中的哪一个“获胜”,从而决定必须发生什么。您可以通过 来查看竞争者以及他们的战斗以及由此产生的解决方案Debug::pkgProblemResolver。

    这是源代码中的一个有趣的小评论:

    /* ######################################################################
    
       Algorithms - A set of misc algorithms
    
       The pkgProblemResolver class has become insanely complex and
       very sophisticated, it handles every test case I have thrown at it
       to my satisfaction. Understanding exactly why all the steps the class
       does are required is difficult and changing though not very risky
       may result in other cases not working.
       
       ##################################################################### */
    

    Rinzwind 评论中的博客文章Debian APT 依赖解析器提供了更多详细信息。它是由一位包维护人员编写的,他对包中发生的奇怪事情感到困惑,并深入研究了算法的微小细节。

    • 5

相关问题

  • 如何编写 shell 脚本来安装应用程序列表?

  • 如何查看存档中可用的软件包的所有版本?

  • 是否可以说出我安装的哪些软件包不在原版安装中?

  • 如何删除 PPA?

  • 使用 apt-get upgrade 时如何强制安装内核更新?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve