2009-11-30 40 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