2016-10-07 6 views
3

Моя команда имеет весь наш код Голанга в monorepo.Найти мертвый код в Golang monorepo

  • Различные подкаталоги пакетов с библиотечным кодом.
  • Бинарники/услуги/инструменты под cmd

У нас было это на некоторое время и делают некоторые очистки. Существуют ли какие-либо инструменты или методы, которые могут найти функции, не используемые в двоичных файлах под cmd?

Я знаю go vet может найти частные функции, которые не используются в пакете. Однако я подозреваю, что мы также экспортировали библиотечные функции, которые также не используются.

+0

Является ли ваше тестовое покрытие хорошим для того, что используется? Вы можете посмотреть профиль обложки и посмотреть, что не покрыто вообще. – JimB

+0

О, другой подход, который вы могли бы предпринять, - это проанализировать файлы, чтобы получить позиции всех экспортируемых функций и методов, а затем вызвать «гуру-звонящих» с соответствующей областью, чтобы увидеть, есть ли какие-либо сайты вызовов. – JimB

+0

@JimB Цените идеи, спасибо. К сожалению, у нас есть пятнистое покрытие кода. Инструмент 'гуру' может быть полезен. –

ответ

5

Dominik Хоннефского в может быть то, что вы ищете:

Необязательно через -exported флага, неиспользованный может анализировать все аргументы в виде одной программы и сообщать неиспользованные экспортируемые идентификаторы. Это может быть полезно для проверки «внутренних» пакетов или крупных программных проектов, которые не экспортируют API для публики, но используют экспортированные методы между компонентами.

0

Попробуйте запустить 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) 
    } 
} 

Выход из 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 

Если я правильно читал это, вторая линия утверждает, что неявный вызов до convT2E (который преобразует типы без интерфейса в типы интерфейсов, поскольку fmt.Println принимает аргументы типа interface{}) является живым, а в третьей строке указано, что вызов fmt.Println в прямом эфире. Обратите внимание, что это не говорят, что звонок fmt.Println(false) жив, поэтому мы можем сделать вывод, что он должен быть мертвым.

Я знаю, что это не идеальный ответ, но я надеюсь, что это поможет. unused инструмента

Смежные вопросы