Dependencies 软件包管理器(aptitude、yum、portage)如何构建依赖关系树?

Dependencies 软件包管理器(aptitude、yum、portage)如何构建依赖关系树?,dependencies,package-managers,Dependencies,Package Managers,我理解基本概念,但是有没有什么特别的算法,或者是一些博客,论文,甚至是一些关于这个主题的书籍,可以供构建自己系统的人使用?关于实际实现这样一个系统的信息似乎很少。许多其他概念也涉及依赖关系树,例如SNMP MIB解析、C/C++源代码编译。因此,您可以参考讨论此问题的任何其他材料:)依赖关系树本身很容易加载,您所需要的只是从键(例如名称)到对象的一些映射 您没有指定任何语言,所以我选择了Python。预期的输入是一个行文件,格式为“[name]:[space separated dependen

我理解基本概念,但是有没有什么特别的算法,或者是一些博客,论文,甚至是一些关于这个主题的书籍,可以供构建自己系统的人使用?关于实际实现这样一个系统的信息似乎很少。

许多其他概念也涉及依赖关系树,例如SNMP MIB解析、C/C++源代码编译。因此,您可以参考讨论此问题的任何其他材料:)

依赖关系树本身很容易加载,您所需要的只是从键(例如名称)到对象的一些映射

您没有指定任何语言,所以我选择了Python。预期的输入是一个行文件,格式为“[name]:[space separated dependencies]”

此代码假定任何未列出的项都没有依赖项,如果需要,可以遍历树以添加空项。至少应该检查递归依赖关系

例如:

>>> input = """\
... a: b c
... b: c
... c: d
... e: a
... """.split("\n")
>>> from pprint import pprint
>>> pprint(load_depends(input))
{'a': set(['b', 'c']),
 'b': set(['c']),
 'c': set(['d']),
 'e': set(['a'])}
[注意:我选择了一个快捷方式,因为我实际上不需要一个行文件,而是需要一个行列表(一个文件遇到的行),所以我将一个行列表传递给函数。]


您可以在此基本结构的基础上构建各种功能,并将其和那些概念(如依赖、建议、建议,甚至冲突、替换等)封装到特定于您的系统的各种对象中。

您有什么具体的想法吗?我的一个问题是,谷歌搜索只会导致人们谈论他们自己的包管理器问题,而不是编程包管理器问题。当我编写#SNMP Suite时,我编写了自己的SNMP MIB解析代码。其中,在加载新的MIB模块之前,使用一个简单的递归算法检查ObjectTree实例中是否已经加载了所有依赖项。一般来说,编写并不是那么难,你可以用你最喜欢的语言从一个小样本项目开始。当你试图查看那些包管理器的源代码时发生了什么?能够看到开源工具是如何编写的,这是他们的一大好处!我已经检查过了,但老实说,有些非常混乱,很难解析。令人震惊的是,我发现PEAR是一个很好的资源,并且已经仔细研究了很多。我建议你用你之前评论的内容更新你的问题。研究相关信息属于问题。
>>> input = """\
... a: b c
... b: c
... c: d
... e: a
... """.split("\n")
>>> from pprint import pprint
>>> pprint(load_depends(input))
{'a': set(['b', 'c']),
 'b': set(['c']),
 'c': set(['d']),
 'e': set(['a'])}