Nächste: , Vorige: , Nach oben: Zubehör   [Inhalt][Index]


9.10 guix graph aufrufen

Pakete und ihre Abhängigkeiten bilden einen Graphen, genauer gesagt einen gerichteten azyklischen Graphen (englisch „Directed Acyclic Graph“, kurz DAG). Es kann schnell schwierig werden, ein Modell eines Paket-DAGs vor dem geistigen Auge zu behalten, weshalb der Befehl guix graph eine visuelle Darstellung des DAGs bietet. Das vorgegebene Verhalten von guix graph ist, eine DAG-Darstellung im Eingabeformat von Graphviz auszugeben, damit die Ausgabe direkt an den Befehl dot aus Graphviz weitergeleitet werden kann. Es kann aber auch eine HTML-Seite mit eingebettetem JavaScript-Code ausgegeben werden, um ein Sehnendiagramm (englisch „Chord Diagram“) in einem Web-Browser anzuzeigen, mit Hilfe der Bibliothek d3.js, oder es können Cypher-Anfragen ausgegeben werden, mit denen eine die Anfragesprache openCypher unterstützende Graph-Datenbank einen Graphen konstruieren kann. Wenn Sie --path angeben, zeigt Guix Ihnen einfach nur den kürzesten Pfad zwischen zwei Paketen an. Die allgemeine Syntax ist:

guix graph Optionen Pakete

Zum Beispiel erzeugt der folgende Befehl eine PDF-Datei, die den Paket-DAG für die GNU Core Utilities darstellt, welcher ihre Abhängigkeiten zur Erstellungszeit anzeigt:

guix graph coreutils | dot -Tpdf > dag.pdf

Die Ausgabe sieht so aus:

Abhängigkeitsgraph der GNU Coreutils

Ein netter, kleiner Graph, oder?

Vielleicht ist es Ihnen aber lieber, den Graphen interaktiv mit dem xdot-Programm anzuschauen (aus dem Paket xdot):

guix graph coreutils | xdot -

Aber es gibt mehr als eine Art von Graph! Der Graph oben ist kurz und knapp: Es ist der Graph der Paketobjekte, ohne implizite Eingaben wie GCC, libc, grep und so weiter. Oft möchte man einen knappen Graphen sehen, aber manchmal will man auch mehr Details sehen. guix graph unterstützt mehrere Typen von Graphen; Sie können den Detailgrad auswählen.

package

Der vorgegebene Typ aus dem Beispiel oben. Er zeigt den DAG der Paketobjekte ohne implizite Abhängigkeiten. Er ist knapp, filtert aber viele Details heraus.

reverse-package

Dies zeigt den umgekehrten DAG der Pakete. Zum Beispiel liefert

guix graph --type=reverse-package ocaml

… den Graphen der Pakete, die explizit von OCaml abhängen (wenn Sie auch an Fällen interessiert sind, bei denen OCaml eine implizite Abhängigkeit ist, siehe reverse-bag weiter unten).

Beachten Sie, dass für Kernpakete damit gigantische Graphen entstehen können. Wenn Sie nur die Anzahl der Pakete wissen wollen, die von einem gegebenen Paket abhängen, benutzen Sie guix refresh --list-dependent (siehe --list-dependent).

bag-emerged

Dies ist der Paket-DAG einschließlich impliziter Eingaben.

Zum Beispiel liefert der folgende Befehl

guix graph --type=bag-emerged coreutils

… diesen größeren Graphen:

Detaillierter Abhängigkeitsgraph der
GNU Coreutils

Am unteren Rand des Graphen sehen wir alle impliziten Eingaben des gnu-build-system (siehe gnu-build-system).

Beachten Sie dabei aber, dass auch hier die Abhängigkeiten dieser impliziten Eingaben – d.h. die Bootstrap-Abhängigkeiten (siehe Bootstrapping) – nicht gezeigt werden, damit der Graph knapper bleibt.

bag

Ähnlich wie bag-emerged, aber diesmal mit allen Bootstrap-Abhängigkeiten.

bag-with-origins

Ähnlich wie bag, aber auch mit den Ursprüngen und deren Abhängigkeiten.

reverse-bag

Dies zeigt den umgekehrten DAG der Pakete. Anders als reverse-package werden auch implizite Abhängigkeiten berücksichtigt. Zum Beispiel liefert

guix graph -t reverse-bag dune

… den Graphen aller Pakete, die von Dune direkt oder indirekt abhängen. Weil Dune eine implizite Abhängigkeit von vielen Paketen über das dune-build-system ist, zeigt er eine große Zahl von Paketen, während bei reverse-package nur sehr wenige bis gar keine zu sehen sind.

derivation

Diese Darstellung ist am detailliertesten: Sie zeigt den DAG der Ableitungen (siehe Ableitungen) und der einfachen Store-Objekte. Verglichen mit obiger Darstellung sieht man viele zusätzliche Knoten einschließlich Erstellungs-Skripts, Patches, Guile-Module usw.

Für diesen Typ Graph kann auch der Name einer .drv-Datei anstelle eines Paketnamens angegeben werden, etwa so:

guix graph -t derivation $(guix system build -d my-config.scm)
module

Dies ist der Graph der Paketmodule (siehe Paketmodule). Zum Beispiel zeigt der folgende Befehl den Graphen für das Paketmodul an, das das guile-Paket definiert:

guix graph -t module guile | xdot -

Alle oben genannten Typen entsprechen Abhängigkeiten zur Erstellungszeit. Der folgende Graphtyp repräsentiert die Abhängigkeiten zur Laufzeit:

references

Dies ist der Graph der Referenzen einer Paketausgabe, wie guix gc --references sie liefert (siehe guix gc aufrufen).

Wenn die angegebene Paketausgabe im Store nicht verfügbar ist, versucht guix graph, die Abhängigkeitsinformationen aus Substituten zu holen.

Hierbei können Sie auch einen Store-Dateinamen statt eines Paketnamens angeben. Zum Beispiel generiert der Befehl unten den Referenzgraphen Ihres Profils (der sehr groß werden kann!):

guix graph -t references $(readlink -f ~/.guix-profile)
referrers

Dies ist der Graph der ein Store-Objekt referenzierenden Objekte, wie guix gc --referrers sie liefern würde (siehe guix gc aufrufen).

Er basiert ausschließlich auf lokalen Informationen aus Ihrem Store. Nehmen wir zum Beispiel an, dass das aktuelle Inkscape in 10 Profilen verfügbar ist, dann wird guix graph -t referrers inkscape einen Graph zeigen, der bei Inkscape gewurzelt ist und Kanten zu diesen 10 Profilen hat.

Ein solcher Graph kann dabei helfen, herauszufinden, weshalb ein Store-Objekt nicht vom Müllsammler abgeholt werden kann.

Oftmals passt der Graph des Pakets, für das Sie sich interessieren, nicht auf Ihren Bildschirm, und überhaupt möchten Sie ja nur wissen, warum das Paket von einem anderen abhängt, das scheinbar nichts damit zu tun hat. Die Befehlszeilenoption --path weist guix graph an, den kürzesten Pfad zwischen zwei Paketen (oder Ableitungen, Store-Objekten etc.) anzuzeigen:

$ guix graph --path emacs libunistring
emacs@26.3
mailutils@3.9
libunistring@0.9.10
$ guix graph --path -t derivation emacs libunistring
/gnu/store/…-emacs-26.3.drv
/gnu/store/…-mailutils-3.9.drv
/gnu/store/…-libunistring-0.9.10.drv
$ guix graph --path -t references emacs libunistring
/gnu/store/…-emacs-26.3
/gnu/store/…-libidn2-2.2.0
/gnu/store/…-libunistring-0.9.10

Manchmal eignet es sich, den angezeigten Graphen abzuschneiden, damit er ordentlich dargestellt werden kann. Eine Möglihkeit ist, mit der Befehlszeilenoption --max-depth (kurz -M) die maximale Tiefe des Graphen festzulegen. Im folgenden Beispiel wird nur libreoffice und diejenigen Knoten dargestellt, deren Distanz zu libreoffice höchstens 2 beträgt:

guix graph -M 2 libreoffice | xdot -f fdp -

Dabei bleibt zwar immer noch ein gewaltiges Spaghettiknäuel übrig, aber zumindest kann das dot-Programm daraus schnell eine halbwegs lesbare Darstellung erzeugen.

Folgendes sind die verfügbaren Befehlszeilenoptionen:

--type=Typ
-t Typ

Eine Graph-Ausgabe dieses Typs generieren. Dieser Typ muss einer der oben genannten Werte sein.

--list-types

Die unterstützten Graph-Typen auflisten.

--backend=Backend
-b Backend

Einen Graph mit Hilfe des ausgewählten Backends generieren.

--list-backends

Die unterstützten Graph-Backends auflisten.

Derzeit sind die verfügbaren Backends Graphviz und d3.js.

--path

Den kürzesten Pfad zwischen zwei Knoten anzeigen, die den mit --type angegebenen Typ aufweisen. Im Beispiel unten wird der kürzeste Pfad zwischen libreoffice und llvm anhand der Referenzen von libreoffice angezeigt:

$ guix graph --path -t references libreoffice llvm
/gnu/store/…-libreoffice-6.4.2.2
/gnu/store/…-libepoxy-1.5.4
/gnu/store/…-mesa-19.3.4
/gnu/store/…-llvm-9.0.1
--expression=Ausdruck
-e Ausdruck

Als Paket benutzen, wozu der Ausdruck ausgewertet wird.

Dies ist nützlich, um genau ein bestimmtes Paket zu referenzieren, wie in diesem Beispiel:

guix graph -e '(@@ (gnu packages commencement) gnu-make-final)'
--system=System
-s System

Den Graphen für das System anzeigen – z.B. i686-linux.

Der Abhängigkeitsgraph ist größtenteils von der Systemarchitektur unabhängig, aber ein paar architekturabhängige Teile können Ihnen mit dieser Befehlszeilenoption visualisiert werden.

--load-path=Verzeichnis
-L Verzeichnis

Das Verzeichnis vorne an den Suchpfad für Paketmodule anfügen (siehe Paketmodule).

Damit können Nutzer dafür sorgen, dass ihre eigenen selbstdefinierten Pakete für die Befehlszeilenwerkzeuge sichtbar sind.

Hinzu kommt, dass guix graph auch all die üblichen Paketumwandlungsoptionen unterstützt (siehe Paketumwandlungsoptionen). Somit ist es kein Problem, die Folgen einer den Paketgraphen umschreibenden Umwandlung wie --with-input zu erkennen. Zum Beispiel gibt der folgende Befehl den Graphen von git aus, nachdem openssl an allen Stellen im Graphen durch libressl ersetzt wurde:

guix graph git --with-input=openssl=libressl

Ihrem Vergnügen sind keine Grenzen gesetzt!


Nächste: guix publish aufrufen, Vorige: guix size aufrufen, Nach oben: Zubehör   [Inhalt][Index]