我的團隊在monorepo中有我們所有的Golang代碼。在Golang monorepo找到死代碼
- 帶庫代碼的各種包子目錄。
cmd
下
cmd
下未被二進制文件使用的函數? 我知道go vet
可以找到包中未使用的私有函數。不過,我懷疑我們也導出了不使用的庫函數。
我的團隊在monorepo中有我們所有的Golang代碼。在Golang monorepo找到死代碼
cmd
下
cmd
下未被二進制文件使用的函數? 我知道go vet
可以找到包中未使用的私有函數。不過,我懷疑我們也導出了不使用的庫函數。
多米尼克·洪內夫的unused
工具可能是你在找什麼:
可選擇通過-exported標誌,未使用的可以分析所有參數作爲一個單獨的程序,並報告未使用的出口標識符。這對於檢查「內部」軟件包或大型軟件項目不會將API導出到公共場所很有用,但可以在組件之間使用導出的方法。
嘗試運行go build -gcflags -live
。這將-live
標誌傳遞給編譯器(go tool compile
),指示它輸出有關活動分析的調試消息。不幸的是,它僅在發現實時代碼時纔打印,而不是死代碼,但您理論上可以看到不會在輸出中顯示。
下面是編譯存儲在dead.go
下面的程序爲例:
go build -gcflags -live
的
package main
import "fmt"
func main() {
if true {
fmt.Println(true)
} else {
fmt.Println(false)
}
}
:
# _/tmp/dead
./dead.go:7: live at call to convT2E: autotmp_5
./dead.go:7: live at call to Println: autotmp_5
如果我正確地讀這篇文章,第二行指出,隱式調用到convT2E
(它將非接口類型轉換爲接口類型,因爲fmt.Println
需要類型爲interface{}
的參數)是活的,第三行指出對fmt.Println
是活的。請注意,它不會說fmt.Println(false)
呼叫是實時的,所以我們可以推斷它一定是死的。
我知道這不是一個完美的答案,但我希望它有幫助。
您的測試覆蓋率是否適合正在使用的內容?您可以查看封面配置文件並查看完全沒有涵蓋的內容。 – JimB
哦,另一種方法是解析文件以獲取所有導出的函數和方法的位置,然後調用具有適當範圍的guru調用者來查看是否有任何調用站點。 – JimB
@JimB感謝您的想法,謝謝。不幸的是,我們的代碼覆蓋率很高。 'guru'工具可能很有用。 –