前阵子实习,在项目中用Graphviz画依赖图,感觉效果不错。在这里分享下。
具体Graphviz的介绍,把基本的命令行语句,Gallery的例子看看,马上就可以上手了。
在Django中应用Graphviz也相当简单,应用Template可以写出很漂亮的代码,结构十分清晰。
首先定义一个模板:
file_template = """
{{file.name}}[style=filled, color=green];
{% if file.dependcy_app %}
node[color=deepskyblue, style=filled]
{{file.dependcy_app.name}}->{{file.name}};
{% endif %}
{% if file.depency_resource.all %}
{% for app in file.depency_resource.all %}
{{file.name}}->{{app.name}}
{% endfor%}
{% endif %}
"""
然后渲染模板
request = Context({'file': file,})
dot = head_template
t = Template(file_template)
dot += '\n' + t.render(request) + tail_template
generate(file, dot)
生成图片
file = open(filename, 'w')
file.write(dot)
file.close()
cmd = "%(path)s/dot -Tpng %(input)s -o %(output)s" %{'path':bin_path, 'input':filename, 'output':outfilename}
os.system(cmd)
ok done!
是不是很简单呢。
具体效果可以看官网上的,我这里就不贴图了。
我在做的时候遇到几点
- subgraph的名称好像只能用cluster开头
- 假如有两个a->b的话,就有2条线,如果不想要的话,graph前面加上个strict就行了
- 生成图片的格式是svg的话,可以点击跳转~~cool
- 可以为图片生成一个title
唯一的缺点好像是官方的讨论不够活跃啊。。不过google一下还是能解决的!