GoLand中使用PlantUML生成UML图

14,823 阅读2分钟

正在学习源码,想通过Goland编辑器上,简单方便地生成出uml类图,能更好理解工程。在网上找一大圈,好像都没有特别的简单的方式。最后通过参考这篇文档GoLand中使用PlantUML生成Go UML图而完成这个目标的,感谢作者!!!但是这篇文章对于我的环境,也是经历了一个晚上好几个小时才折腾成功的。现在记录下过程,也希望能帮助其他同学能直接快速用上。

环境介绍

win10系统,Goland是JetBrains GoLand 2018.3.1 x64版本。开始前先确保如下软件已安装并添加到PATH中可执行。 GOROOT和GOPATH还不清晰的同学建议先查看其他文档,搞懂两个名词概念。

  • Java
  • Golang
  • GoLand
  • Graphviz 点击左边的链接,选择下图的msi下载,完成直接双击运行安装即可。

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