开源:Go语言的循环依赖解决工具 —— go-cyclic

1,366 阅读2分钟

有时候在接手一个大型Go项目的时候,如果出现包与包之间的依赖,那么项目是无法启动的。报错提示也很多,排查起来非常头疼。所有自己开源了一款循环依赖解决工具 go-cyclic, 求 star ❤️❤️❤️

什么时候会出现循环依赖?

如果有两个包:package a 和 package b。当在包a依赖包b,包b依赖包a时,就会产生循环依赖。真实情况可能会更复杂一些。例如,如包a依赖包b,包b依赖包c,包c又依赖包a时,形成一个环。

import cycle not allowed

而且如果项目很大的时候,一个包下面有很多 .go 文件,只提示包与包的循环引用(如上图),是很难定位到哪个 .go 文件和哪个 .go 文件直接进行了循环引用,难以排查。

go-cyclic 简单用法

地址:github.com/elza2/go-cy… (求 star ❤️❤️❤️)

go-cyclic 可以用来快速检查项目是否存在循环依赖,并且可以定位到具体的 .go 文件。帮助快速定位循环问题。

快速开始

go install github.com/elza2/go-cyclic@latest
# path 路径要设置为 go.mod 文件所在的路径.
# filter 过滤匹配的文件, 多个条件使用逗号隔开(,) [可选]
go-cyclic run --dir .path [--filter *_test.go]

运行结果

如果项目不存在循环依赖,显示:

Success. Not circular dependence.

如果项目存在循环依赖问题,并打印出循环依赖文件。则显示:

Failed. 1 circular dependence chains were found.

┌---→    app.go
┆          ↓
┆       routes.go
┆          ↓
└---    handler.go

功能测试

image.png

以 mac 系统为例, 在 Makefile 文件中写入:

cyclic:
   go install github.com/elza2/go-cyclic@latest
   go-cyclic run --dir example/three_cyclic --filter *_test.go

在控制台运行:

make cyclic
MacBook-Pro go-cyclic % make cyclic                                                
go install github.com/elza2/go-cyclic@latest
go-cyclic run --dir example/three_cyclic --filter *_test.go
Failed. 1 circular dependence chains were found. 

┌---→  /Users/go/src/go-cyclic/example/three_cyclic/a/a.go
┆                               ↓
┆      /Users/go/src/go-cyclic/example/three_cyclic/b/b.go
┆                               ↓
└---   /Users/go/src/go-cyclic/example/three_cyclic/c/c.go