GraphViz-Dateiexport für den Delphi-Compiler
Ab RAD Studio 12.0 verfügt der Delphi-Compiler über ein experimentelles Feature, mit dem die Strukturen von Projekten verdeutlicht und zirkuläre Unit-Verweise vermieden werden können. Zirkuläre Unit-Verweise verlangsamen die Compilierung und können in Kombination mit anderen Sprachfeatures Nebenwirkungen auf den Compiler haben. Dieses Feature kann einen uses-Anweisungsgraphen direkt auf Compiler-Ebene (ohne ein separates Analysetool) generieren.
Der Compiler verfügt über die neue Befehlsoption --graphviz, die einen Unit-Abhängigkeitsgraphen in einer .gv-GraphViz-Datei generiert. Diese Datei kann von GraphViz (einem Open-Source-Tool, das unter https://graphviz.org/ erhältlich ist) verarbeitet werden. Es gibt auch eine zweite Option zum Ausschließen von Units (einzeln oder nach Familie) aus dem Graphen:
--graphviz (gibt die Datei <exe-Name>.gv aus)
--graphviz-exclude:<Unit-Liste> (schließt bestimmte Unit-Namen aus der Ausgabe aus)
Bei --graphviz-exclude kann das Unit-Namensmuster den Platzhalter '*' enthalten und mehrere Unit-Namensmuster können in der <Unit-Liste> durch ';' getrennt angegeben werden.
Zum Beispiel: --graphviz-exclude:System.*;VCL.*;FMX.* schließt alle System-, VCL- und FireMonkey-Units aus.
Sehen Sie sich als Beispiel eine einfache Anwendung an, die aus einem Hauptformular, einem zweiten Dialogfeld und einem Datenmodul besteht. Diese verweisen in den uses-Anweisungen im Abschnitt "interface" und im Abschnitt "implementation" aufeinander. Sie können mit dem folgenden Befehl in der Befehlszeile erzeugt werden (wobei System-Units ausgeschlossen werden):
dcc32 --graphviz --graphviz-exclude=System.*;Vcl.*;WinApi.* GraphTest.dpr
Es wird die folgende .gv-Datei generiert, in der style=dashed für uses-Anweisungen im implementation-Abschnitt verwendet wird:
digraph GraphTest {
GraphTest -> { GT_mainform GT_dialog GT_datamodule }
GT_mainform -> { GT_datamodule GT_dialog }
GT_datamodule
GT_dialog -> { GT_datamodule GT_mainform } [arrowhead=open,style=dashed]
}
Damit wird ein Graph wie der folgende erzeugt: