Лучший способ взглянуть на исходный код — получить общее представление о взаимосвязи вызовов внутренних модулей системы с точки зрения макросов. Этот процесс делится на статический анализ и динамический анализ. Динамический анализ очень прост, достаточно напрямую взять данные из памяти, например pprof от Golang. Недостатком динамического анализа является то, что он зависит от трафика или данных доступа.Различные данные доступа часто приводят к различным отношениям вызова. Для статического анализа на рынке также есть много полезных инструментов с открытым исходным кодом.Сегодня давайте посмотрим, как выполнить статический анализ зависимостей кода Golang.
Статический анализ кода Golang особенно прост, почему? С точки зрения синтаксиса Golang, когда мы вызываем пакет, нам нужно импортировать. При этом, если в нашем коде нет ссылки на пакет и пакет импортируется, компилятор Golang в это время сообщит об ошибке. Эти два пункта означают, что мы можем получить взаимосвязь вызова внутри нашего пакета, проанализировав блок импорта.
Конечно, хотя приведенный выше принцип относительно прост, в реализации все же есть некоторые подводные камни. Все в порядке, я сделал это для тебя. Связь:GitHub.com/legend T смотрел/a…. Название DAG также связано с тем, что зависимости между пакетами на самом деле являются DAG.
1. Установка
go get -u github.com/legendtkl/godag
Когда я внедрил пакет, я не ссылался на сторонний пакет, который также предназначен для студентов, которые не могут перейти через стену, чтобы пройти без барьеров.
2. Используйте
Возьмите проект beego в качестве примера, чтобы проанализировать взаимосвязь вызовов между его внутренними пакетами.
godag --pkg_name=github.com/astaxie/beego --pkg_path=/Users/kltao/code/go/src/github.com/astaxie/beego --depth=1 --dot_file_path=a.dot
godag поддерживает четыре параметра:
- pkg_name: имя пакета для анализа, требуется
- pkg_path: каталог, в котором пакет хранится локально, обязательно
- глубина: глубина кода анализа. Например, если глубина равна 1, мы будем анализировать пакеты: beego/cache, beego/context, а если глубина равна 2, мы будем анализировать эти пакеты: beego/cache/redis, beego/cache/ssdb и т. д.
- dotfileпуть: это точечный файл, который мы выводим, подробно описанный ниже
3. Выход
3.1 dot
godag выведет файл .dot. dot — это язык рисования, который позволяет вам быстро и интуитивно выражать некоторые идеи в графическом виде, например, описание решения проблемы, представление потока программы и разъяснение множества, казалось бы, неорганизованных вещей. Например, точечный файл и соответствующая блок-схема перечислены ниже.
digraph graphname {
a -> b -> c;
b -> d;
}
Соответствующий блок-схема.
Более подробную информацию о точечном файле можно найти здесь:DOT(graph description language). Содержимое созданного нами точечного файла выглядит следующим образом.
digraph G {
"beego/utils" -> "beego/session"
"beego/logs" -> "beego/logs"
"beego/utils" -> "beego"
}
3.2 Визуализация
Визуализацию точечных файлов можно выполнить с помощью graphviz. Установка graphviz относительно проста, например, команда установки на Mac выглядит следующим образом
brew install graphviz
Для визуализации точечных файлов используйте точечные команды, например создание изображений png.
dot -Tpng godag.dot > godag.png
4. Примеры
Например, когда глубина равна 1, внутренний граф зависимостей beego выглядит следующим образом.
2 Когда глубина графа зависимости следующим образом.
5. Ссылка
Вопросы и PRS приветствуются.