Open ma6174 opened 5 years ago
https://github.com/ma6174/go_dep_search
新版的 go_dep_search
支持分析包调用链、支持找出未被使用的包。
增加了一个图形化分析包完整调用链的功能,比如分析标准库的 net/http
到 net
的调用链,欢迎更新到最新版使用 😄
root@b7e158d83ff2:/go# go list -json all | go_dep_search -graph -o net.jpg net/http net
赞,我之前也有类似的问题,需要找到init依赖的顺序,不知道这两个是否可以整合到一起? https://github.com/xhd2015/go-inspect/tree/master/cmd/depcheck
depcheck -mod=vendor ./
效果相似,但目的不一样。 depcheck主要是找到程序启动的时候,init的顺序;go_dep_search则是找到依赖树。
我已收到你发的邮件,我将会尽快阅读,谢谢!
开发过程中经常会遇到这样的问题:我改了一个包,哪些服务受影响?我们期望是把所有相关的服务都升级,避免出现遗漏。
对于业务不复杂或者比较偏上层的包,大部分直接在代码库里面
grep
一下就知道了。如果的偏底层的包,业务不一定会直接引用,这种直接分析的话就比较复杂了。之前有种比较麻烦但是也相对有效的方法。我们知道Go的编译是有缓存的,如果代码有变更的话就会触发包重新编译,通过
go build -v
可以把重新编译的包的名字输出出来,当然也包含最终的服务程序。实际操作的时候需要避免ide编译影响。后来研究了一下,实际有更好的办法来实现。
go list
命令有个-json
的参数,会自动分析各个包的依赖关系,以json的格式输出出来,我们以官方库里面的encoding/base64
包为例:点击展开查看...
```bash # go list -json encoding/base64 { "Dir": "/usr/local/go/src/encoding/base64", "ImportPath": "encoding/base64", "Name": "base64", "Doc": "Package base64 implements base64 encoding as specified by RFC 4648.", "Target": "/usr/local/go/pkg/linux_amd64/encoding/base64.a", "Root": "/usr/local/go", "Match": [ "encoding/base64" ], "Goroot": true, "Standard": true, "GoFiles": [ "base64.go" ], "Imports": [ "encoding/binary", "io", "strconv" ], "Deps": [ "encoding/binary", "errors", "internal/bytealg", "internal/cpu", "internal/race", "io", "math", "math/bits", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/math", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "unicode", "unicode/utf8", "unsafe" ], "TestGoFiles": [ "base64_test.go" ], "TestImports": [ "bytes", "errors", "fmt", "io", "io/ioutil", "reflect", "strings", "testing", "time" ], "XTestGoFiles": [ "example_test.go" ], "XTestImports": [ "encoding/base64", "fmt", "os" ] } ```
其中有几个字段需要关注一下:
ImportPath
:在执行包引用时的名字encoding/base64
Name
:包的名字base64
Imports
:这个包直接引用的包:"encoding/binary", "io", "strconv"
Deps
:这个包所有递归依赖的包有了上面的
Deps
信息之后,开头提到的依赖分析问题就比较简单了。只要在Deps
里面有我们修改的包就可以了,如果要找是哪个服务的话,需要看Name
是main
的包。另外go list -json ./...
就可以分析当前项目里面的所有包。go list -json ./...
输出的信息还是挺多的,为了方便分析,写了个小工具 go_dep_search (https://github.com/ma6174/go_dep_search)比如找出官方库里面所有依赖
net/http
或者encoding/json
的可执行程序(ImportPath
那一列):希望对大家有帮助。