在Golang monorepo中找到死代码

Mic*_*lin 8 refactoring go

我的团队将所有Golang代码都放在monorepo中.

  • 包含库代码的各种包子目录.
  • 二进制文件/服务/工具 cmd

我们已经有一段时间了,正在做一些清理工作.是否有任何工具或技术可以找到二进制文件未使用的功能cmd

我知道go vet可以找到包中未使用的私有函数.但是我怀疑我们还导出了未使用的库函数.

Ain*_*r-G 11

Dominik Honnef的unused工具可能正是您所寻找的:

可选地,通过-exported标志,unused可以将所有参数分析为单个程序并报告未使用的导出标识符.这对于检查"内部"包或不向公共导出API但在组件之间使用导出方法的大型软件项目非常有用.

  • https://staticcheck.io/changes/2020.2/#unused-whole-program 从 Staticcheck 2020.2 开始,`staticcheck` 中不再有整个程序模式 (4认同)
  • 似乎“unused”不再作为独立工具存在,而是被“staticcheck”取代。我似乎无法使用“staticcheck”来做到这一点,你知道怎么做吗? (3认同)
  • 谢谢你!`$ go run honnef.co/go/tools/cmd/staticcheck --unused.whole-program=true -- ./...` 对我来说效果很好! (2认同)

jos*_*hlf 6

尝试跑步go build -gcflags -live。这会将-live标志传递给编译器 ( go tool compile),指示它输出有关活性分析的调试消息。不幸的是,它仅在找到活动代码而不是死代码时才打印,但理论上您可以查看输出中未显示的内容。

以下是编译存储在 中的以下程序的示例dead.go

package main

import "fmt"

func main() {
    if true {
        fmt.Println(true)
    } else {
        fmt.Println(false)
    }
}
Run Code Online (Sandbox Code Playgroud)

输出go build -gcflags -live

# _/tmp/dead
./dead.go:7: live at call to convT2E: autotmp_5
./dead.go:7: live at call to Println: autotmp_5
Run Code Online (Sandbox Code Playgroud)

如果我正确地阅读了这一点,第二行指出对的隐式调用convT2E(它将非接口类型转换为接口类型,因为fmt.Println采用类型的参数interface{})是实时的,第三行指出对的调用fmt.Println是实时的。请注意,它并没有说该fmt.Println(false)调用是活动的,因此我们可以推断它一定是死的。

我知道这不是一个完美的答案,但我希望它有所帮助。