Nächste: guix publish
aufrufen, Vorige: guix size
aufrufen, Nach oben: Zubehör [Inhalt][Index]
guix graph
aufrufenPakete 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:
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:
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)
Modul
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:
Eine Graph-Ausgabe dieses Typs generieren. Dieser Typ muss einer der oben genannten Werte sein.
Die unterstützten Graph-Typen auflisten.
Einen Graph mit Hilfe des ausgewählten Backends generieren.
Die unterstützten Graph-Backends auflisten.
Derzeit sind die verfügbaren Backends Graphviz und d3.js.
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
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)'
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.
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]