包管理器(aptitude,yum,portage)如何构建其依赖树?

时间:2009-11-30 08:18:24

标签: dependencies package-managers

我理解基本概念,但是有没有使用过任何特殊算法,或者某些博客,论文甚至是关于这个主题的书籍,有人建立自己的系统?关于实际实现这样的系统的信息似乎很少。

2 个答案:

答案 0 :(得分:2)

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

你没有指定任何语言,所以我选择了Python。预期输入是“[name]:[space separation dependencies]”形式的行文件。

def load_depends(file):
  depends = {}
  for line in file:
    line = line.strip()
    if not line or line.startswith("#"):  # allow blanks and comments
      continue
    name, _, deps = line.partition(":")
    deps = deps.strip()
    assert deps, "invalid input"  # most basic input error-checking
    depends[name] = set(deps.split())
  return depends

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

示例:

>>> 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'])}

[注意:我选择了一个快捷方式,因为我真的不需要行文件,而是一行可迭代的行(文件遇到),所以我将一个行列表传递给函数。]

你可以在这个基本结构之上构建各种各样的函数,并将它和那些概念(比如依赖vs推荐vs建议,甚至冲突与替换等)封装到特定于你的系统的各种对象中。

答案 1 :(得分:0)

许多其他概念也涉及依赖树,例如SNMP MIB解析,C / C ++源代码编译。所以你可以参考任何其他谈论这个的材料:)