开发人员在项目中最头大的事情,恐怕非写文档莫属了,第一要排版,第二要画图,排版这件事,有了mark down以后,大大降低了我们排版所花的心力,而画图却仍然是个头疼的活。一方面画图本身,拖拽组件、调整布局,另一方面,对于图形的版本管理也一直是个难题,我们很容易使用版本控制工具例如git、svn等来查看文本文件每次修改了什么,但对图做了什么调整改动,却没办法diff。

这里我们隆重推荐Dot Language,一款用代码来画图的语言,也是开发人员的福音。

我们看下面这幅图:

dot_language_example

源码如下:

1
2
3
4
5
6
7
digraph abc {
"A" -> "B";
"B" -> "C";
"B" -> "D";
"C" -> "E";
"C" -> "F";
}

可以看到,代码非常简明表意。
可能有人会说,这个图太过简单,我们画图的时候,希望有一些更高级的要求,比如,有些箭头没有,比如我的图,是从下到上的,或者我需要线条样式、颜色不同,没问题,dot language支持更换样式。

我们来看下面这幅图:

dot_language_2

源码如下:

1
2
3
4
5
6
7
8
9
10
11
digraph abc {
fontname = "Helvetica";
fontsize=8;
rankdir=LR;
"A" [shape="record"]
"A" -> "B" [style="dashed", color="red", arrowhead="none"];
"B" -> "C";
"B" -> "D";
"C" -> "E";
"C" -> "F";
}

其中,rankdir=LR;表示从左到右,相应的还有从上到下(TB)从下到上(BT)。
arrowhead=”none”为无箭头。

这样一来是不是觉得画图很容易?

用过sequel pro这款数据库客户端软件的人,大多都使用过它导出过ER图,细心的用户会注意到,在选择导出格式时,有个选项,便是导出为dot文件。我们来感受一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// ************************************************************
// Generated by: Sequel Pro
// Version 4541
//
// http://www.sequelpro.com/
// https://github.com/sequelpro/sequelpro
//
// Host: 127.0.0.1 (MySQL 5.7.15)
// Database: test
// Generation Time: 2017-04-18 08:25:30 +0000
// ************************************************************

digraph "Database Structure" {
label = "ER Diagram: test";
labelloc = t;
compound = true;
node [ shape = record ];
fontname = "Helvetica";
ranksep = 1.25;
ratio = 0.7;
rankdir = LR;
subgraph "table_department" {
node [ shape = "plaintext" ];
"department" [ label=<
<TABLE BORDER="0" CELLSPACING="0" CELLBORDER="1">
<TR><TD COLSPAN="3" BGCOLOR="#DDDDDD">department</TD></TR>
<TR><TD COLSPAN="3" PORT="id">id:<FONT FACE="Helvetica-Oblique" POINT-SIZE="10">INT</FONT></TD></TR>
<TR><TD COLSPAN="3" PORT="name">name:<FONT FACE="Helvetica-Oblique" POINT-SIZE="10">VARCHAR</FONT></TD></TR>
</TABLE>>
];
}
subgraph "table_user" {
node [ shape = "plaintext" ];
"user" [ label=<
<TABLE BORDER="0" CELLSPACING="0" CELLBORDER="1">
<TR><TD COLSPAN="3" BGCOLOR="#DDDDDD">user</TD></TR>
<TR><TD COLSPAN="3" PORT="id">id:<FONT FACE="Helvetica-Oblique" POINT-SIZE="10">INT</FONT></TD></TR>
<TR><TD COLSPAN="3" PORT="username">username:<FONT FACE="Helvetica-Oblique" POINT-SIZE="10">VARCHAR</FONT></TD></TR>
<TR><TD COLSPAN="3" PORT="password">password:<FONT FACE="Helvetica-Oblique" POINT-SIZE="10">VARCHAR</FONT></TD></TR>
<TR><TD COLSPAN="3" PORT="is_active">is_active:<FONT FACE="Helvetica-Oblique" POINT-SIZE="10">TINYINT</FONT></TD></TR>
<TR><TD COLSPAN="3" PORT="department_id">department_id:<FONT FACE="Helvetica-Oblique" POINT-SIZE="10">INT</FONT></TD></TR>
</TABLE>>
];
}
edge [ arrowhead=inv, arrowtail=normal, style=dashed, color="#444444" ];
user:department_id -> department:id ;
}

生成图形如下:

ER_example

好,说了这么多dot语言的强大之处,接下来我们看看如何把文件转化成图片。

  1. 准备好你的dot文件
  2. 去官网下载并安装http://www.graphviz.org/Download..php
  3. 在你的dot文件所在的路径下,执行:dot -Tpng 文件名.dot > 图片名.png,图片就生成好了。

By the way,如果你不想给本机安装dot,那么也可以直接拉docker镜像来操作,写一段shell帮助生成,也很方便,如下:

1
2
3
WORKING="/backup"
IMG="themarquee/graphviz"
docker run --rm -w $WORKING -v $(pwd):$WORKING $IMG dot $@

此时,相信你已经重新拾起了画图写文档的信心,那么参考官方文档,查看更多酷炫的功能吧:
http://www.graphviz.org/content/dot-language