我有下面的例子import networkx as nx
data = {
'modules': {
'aws_vpc': {
'deps': []
},
'aws_security_group': {
'deps': ['aws_vpc']
},
'aws_subnet': {
'deps': ['aws_vpc']
},
'aws_db_subnet': {
'deps': ['aws_subnet']
},
'aws_db_instance': {
'deps': ['aws_security_group','aws_db_subnet']
}
}
}
G = nx.DiGraph()
roots = set()
for module,data in data['modules'].items():
if len(data['deps']) == 0:
roots.add(module)
continue
for d in data['deps']:
G.add_edge(d, module)
for s in roots:
print s
spacer = {s: 0}
for prereq, target in nx.dfs_edges(G, s):
spacer[target] = spacer[prereq] + 2
print '{spacer}+-{t}'.format(
spacer=' ' * spacer[prereq],
t=target)
print ''
现在看来
^{pr2}$
我要做的是从依赖关系中找到与根模块的当前距离。比如说。aws_db_实例依赖于aws_security_组和aws_db_子网。在
aws_db_子网较远,因此它应该将aws_db_实例添加到那里的边缘。我只是想不出一个方法来找出与模块依赖性的距离。在
我知道图并不总是表现为树,所以可能我使用了错误的模块,但想法是你可以有很多根,没有任何依赖关系。所以我觉得networkx是个不错的选择。在
所以最终结果应该是aws_vpc
+-aws_security_group
+-aws_subnet
+-aws_db_subnet
+-aws_db_instance