Как менеджеры пакетов (aptitude, yum, portage) строят свои деревья зависимостей? - PullRequest
0 голосов
/ 30 ноября 2009

Я понимаю основные понятия, но существуют ли какие-либо специальные алгоритмы или, может быть, какие-то блоги, статьи или даже книги на эту тему для кого-то, строящего свою собственную систему? Кажется, очень мало информации о том, как на самом деле реализовать такую ​​систему.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2010

Само дерево зависимостей загрузить тривиально, все, что вам нужно, - это некоторое сопоставление ключей (например, имен) с объектами.

Вы не указали ни одного языка, поэтому я выбрал Python. Ожидаемый ввод - это файл строк в форме "[имя]: [разделенные пробелами зависимости]".

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

[Примечание: я использую ярлык, так как мне действительно не нужен файл строк, а есть итерация строк (с которыми встречается файл), поэтому я передаю список строк функции.]

Вы можете создавать всевозможные функции поверх этой базовой структуры и инкапсулировать ее и эти концепции (например, зависит от того, рекомендует ли, рекомендует и даже конфликтует с заменой и т. Д.) В различные объекты, специфичные для вашей системы. *

0 голосов
/ 30 ноября 2009

Многие другие концепции также включают деревья зависимостей, такие как разрешение SNMP MIB, компиляция исходного кода на C / C ++. Таким образом, вы можете ссылаться на любые другие материалы, которые говорят об этом:)

...