[PYTHON] Visualisieren Sie die internen Paketbeziehungen von Go auf Commit-by-Commitment-Basis
Verwendetes Programm: bxcodec / go-clean-arch
Überblick
- Es ist schwierig, Programme mit komplizierten Beziehungen zwischen den internen Paketen von Go zu verstehen.
- Ich möchte visualisieren
――Weil es eine große Sache ist, lassen Sie uns jedes Commit visualisieren und es zu einer Animation machen
Vorbereitung
Code
Was ich getan habe
- Holen Sie sich das Commit-Protokoll
- Führen Sie den Befehl für jedes Commit aus
- Geben Sie die internen Paketbeziehungen von Go aus, um Faril zu markieren und ein GIF zu erstellen
- Erstellen Sie für jedes Commit eine Animation mit derselben GIF-Größe
1. Holen Sie sich das Commit-Protokoll
Sie können es mit git log --pretty = oneline
erhalten.
Jedenfalls mit Python
res = subprocess.check_output(["git", "-C", path_dir, "log", "--pretty=oneline"])
Ich möchte nur den Hash-Wert des Commits erhalten (Hash-Wert + Kommentar). Ich habe nur den ersten Hash-Wert durch ein Leerzeichen getrennt und es in eine Liste gemacht.
2. Führen Sie den Befehl für jedes Commit aus
Ich habe jedes Commit zurückgesetzt und den Befehl ausgeführt (gibt es einen besseren Weg als das Zurücksetzen?).
for commit in log_list:
subprocess.call(["git", "-C", path_dir, "reset", "--hard", commit]) |
command(path_dir)
Verwenden Sie den Pfad des Verzeichnisses, in dem sich das Programm befindet, wenn Sie den Befehl ausführen.
3. Geben Sie die internen Paketbeziehungen von Go aus, um Faril zu markieren und ein GIF zu erstellen
3.1. Erstellung von Punktdateien
Das ist das Schwierigste.
Es gibt ein sehr nützliches Paket namens parser, das das Paket erhält, das Sie in die Datei importieren. Dies kann von Datei zu Paket gruppiert werden.
Ärger
- Durch Datei-> Nach Paket
Der Parser erhält auch den Paketnamen der Datei, ist jedoch nicht zu unterscheiden, wenn sich in einem anderen Verzeichnis derselbe Paketname befindet. Ich habe das Verzeichnis gespeichert, aber es scheint einen einfacheren Weg zu geben
- Unterscheidung externer Pakete
Ich wollte nur interne Pakete (von mir selbst erstellt) ansprechen. Wie kann ich sie unterscheiden? ?? Ich habe es wie "extern, wenn es Github gibt" gemacht, aber es scheint, dass es keine sehr gute Methode ist.
3.2. Erstellen einer GIF-Datei aus einer Punktdatei
Verwenden Sie graphviz.
dot -T gif sample.dot -o sample.gif
4. Erstellen Sie für jedes Commit eine Animation mit derselben GIF-Größe
4.1. GIF-Größen ausrichten
Wenn beim Erstellen einer Animation die Größe jeder Datei unterschiedlich ist, wird die Größe abgeschnitten.
mogrify -resize (width)x(height)! *.gif
Wählen Sie eine Größe, die sich gut anfühlt.
4.2. Animationserstellung
Verwenden Sie ImageMagick.
convert -delay 5 -loop 0 *.gif animation.gif
Referenzierte Site
von jetzt an
Die Anzeigeposition des Diagramms wird für jedes Commit unterschiedlich und ist beim Animieren schwer zu erkennen. Ich möchte es irgendwie arrangieren.