2009-11-30 31 views
0

我理解这些基本概念,但是有没有使用特殊算法,或者有些博客,论文甚至是关于这个主题的书籍,可以让他们构建自己的系统?实际上实施这样的系统似乎没有什么信息。包管理器(aptitude,yum,portage)如何构建它们的依赖树?

+0

当您试图查看这些软件包管理器的源代码时发生了什么?能够看到如何编写开源工具是他们的一大好处! – 2010-02-22 11:41:58

+1

我已经检查过他们,但说实话,有些非常混乱,很难分析。令人震惊的是,我发现PEAR是一个很好的资源,并且已经对它进行了相当多的研究。 – tedivm 2010-02-23 18:47:39

+0

我建议你用你之前评论的内容更新你的问题。与研究有关的信息属于这个问题。 – tzot 2011-11-13 07:53:04

回答

2

依赖关系树本身加载是微不足道的,所有你需要的是从键(如名称)到对象的一些映射。

你还没有指定任何语言,所以我选择了Python。期望的输入是以“[name]:[空格分隔的依赖关系]”形式的行文件。

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替换等)特定于您的系统的对象。

0

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

+0

你有什么具体的想法?我的问题之一是,搜索只会导致人们谈论他们自己的软件包管理器问题,而不是编程。 – tedivm 2009-11-30 08:32:37

+0

当我编程#SNMP Suite时,我编写了自己的SNMP MIB解析代码。在加载新的MIB模块之前,利用一个简单的递归算法来检查是否所有的依赖项都已经加载到了ObjectTree实例中。 一般来说,写起来并不难,而且您总是可以从您喜欢的语言的小样本项目开始。 – 2009-11-30 09:13:42