正在学习源码,想通过Goland编辑器上,简单方便地生成出uml类图,能更好理解工程。在网上找一大圈,好像都没有特别的简单的方式。最后通过参考这篇文档GoLand中使用PlantUML生成Go UML图而完成这个目标的,感谢作者!!!但是这篇文章对于我的环境,也是经历了一个晚上好几个小时才折腾成功的。现在记录下过程,也希望能帮助其他同学能直接快速用上。
环境介绍
win10系统,Goland是JetBrains GoLand 2018.3.1 x64版本。开始前先确保如下软件已安装并添加到PATH中可执行。 GOROOT和GOPATH还不清晰的同学建议先查看其他文档,搞懂两个名词概念。
GoLand中安装PlantUML插件
- 点击菜单 File -> Settings -> Plugins -> Marketplace
- 搜索框输入
PlantUML,选择点击Install,安装重启后生效
安装go-package-plantuml工具
这一步花费了很久的时间。
go get git.oschina.net/jscode/go-package-plantuml执行这个命令却是失败的。
通过网上找原因和不断尝试总结,步骤如下:
- 我在D盘目录下创建目录为
plantUml,同时将这个路径D:\plantUml添加到系统的GOPATH中。 通过git命令方式,将工程clone下来放到plantUml目录下git clone https://gitee.com/jscode/go-package-plantuml.git。
- 在plantUml目录下新增目录src\git.oschina.net\jscode 然后将go-package-plantuml工程目录整个复制过来。(不要问为什么,这里尝试了很久,我现在也还没弄清楚为什么)。最后的路径是下图的形式:

- 进入到
go-package-plantuml目录,即有main.go文件一层,执行go build。
$ go build
go: GOPATH entry is relative; must be absolute path: "".
For more details see: 'go help gopath'
以上错误,通过删除GOPATH路径中最后的符号‘;’可以解决,生成go-package-plantuml.exe可执行文件。

GoLand中添加External Tools
- 点击菜单 File -> Settings -> Tools -> External Tools
- Name: 填写一个plantUml的名称
- Program: 选择上面生成的go-package-plantuml.exe执行文件路径
- Arguments:设置为
--gopath $GOPATH$ --codedir $FileDir$ --outputfile $FileDir$.puml
GoLand生成UML图
- 右键点击源码所在的目录选择External Tools执行
- 生成*.puml文件,直接双击打开即可查看。如果你的GoLand配置多个地址,是会失败的,修改为只剩当前工程的就可以了。但这时我会发现,并未能真正显示uml类图,而是报错了。于是我开始一步步调试修改源码。

源码修改
- main.go文件修改了以下两点。path库的使用全部改为filepath库,不然会因为在window下路径文件导致文件路径找不到。
VendorDir : path.Join(opts.CodeDir, "vendor") ---》VendorDir : filepath.Join(opts.CodeDir, "vendor")
result.OutputToFile("/tmp/uml.txt") ---》result.OutputToFile(opts.OutputFile)
- codeanalysis.go文件。也同样将path库改为filepath库。
func (this *interfaceMeta) UniqueNameUML() string {
return packagePathToUML(this.PackagePath) + "." + this.Name
}
---》
func (this *interfaceMeta) UniqueNameUML() string {
return this.Name
}
func (this *structMeta) UniqueNameUML() string {
return packagePathToUML(this.PackagePath) + "." + this.Name
}
---》
func (this *structMeta) UniqueNameUML() string {
return this.Name
}
if (strings.HasPrefix(filepath, this.config.VendorDir)) --》if (strings.HasPrefix(this.config.VendorDir, filePath))
if strings.HasPrefix(filepath, srcdir) ---》if strings.HasPrefix(srcdir, filePath)
- 导入修改后的exe,可以正常在Goland中生成UML图。虽然对于大的包,有些地方还得手动处理一下,但总体可以接受。后续还会继续优化源码来实现更好。

改完生成的exe,可以在这里下载。
链接:pan.baidu.com/s/1I5GWbu6R…
提取码:2t6r
