2016-10-07 25 views
3

我的團隊在monorepo中有我們所有的Golang代碼。在Golang monorepo找到死代碼

  • 帶庫代碼的各種包子目錄。 cmd

  • 二進制文件/服務/工具我們已經受夠了一會兒,並做一些清理工作。是否有任何工具或技術可以找到cmd下未被二進制文件使用的函數?

    我知道go vet可以找到包中未使用的私有函數。不過,我懷疑我們也導出了不使用的庫函數。

  • +0

    您的測試覆蓋率是否適合正在使用的內容?您可以查看封面配置文件並查看完全沒有涵蓋的內容。 – JimB

    +0

    哦,另一種方法是解析文件以獲取所有導出的函數和方法的位置,然後調用具有適當範圍的guru調用者來查看是否有任何調用站點。 – JimB

    +0

    @JimB感謝您的想法,謝謝。不幸的是,我們的代碼覆蓋率很高。 'guru'工具可能很有用。 –

    回答

    5

    多米尼克·洪內夫的unused工具可能是你在找什麼:

    可選擇通過-exported標誌,未使用的可以分析所有參數作爲一個單獨的程序,並報告未使用的出口標識符。這對於檢查「內部」軟件包或大型軟件項目不會將API導出到公共場所很有用,但可以在組件之間使用導出的方法。

    0

    嘗試運行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)呼叫是實時的,所以我們可以推斷它一定是死的。

    我知道這不是一個完美的答案,但我希望它有幫助。