有时候在接手一个大型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
功能测试
以 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