Suivant: Invoquer guix publish
, Précédent: Invoquer guix size
, Monter: Utilitaires [Table des matières][Index]
guix graph
Les paquets et leurs dépendances forment un graphe, plus précisément
un graphe orienté acyclique (DAG). Il peut vite devenir difficile d’avoir
une représentation mentale du DAG d’un paquet, donc la commande
guix graph
fournit une représentation visuelle du DAG. Par
défaut, guix graph
émet un représentation du DAG dans le format
d’entrée de Graphviz, pour que sa sortie
puisse être passée directement à la commande dot
de Graphviz.
Elle peut aussi émettre une page HTML avec du code Javascript pour afficher
un « diagramme d’accords » dans un navigateur Web, grâce à la bibliothèque
d3.js, ou émettre des requêtes Cypher pour
construire un graphe dans une base de donnée de graphes supportant le
langage de requêtes openCypher. Avec
l’option --path, elle affiche simplement le chemin le plus court
entre deux paquets. La syntaxe générale est :
guix graph options paquet…
Par exemple, la commande suivante génère un fichier PDF représentant le DAG du paquet pour GNU Core Utilities, qui montre ses dépendances à la compilation :
guix graph coreutils | dot -Tpdf > dag.pdf
La sortie ressemble à ceci :
Joli petit graphe, non ?
Vous pouvez trouver plus amusant de naviguer dans le graphe interactivement
avec xdot
(du paquet xdot
) :
guix graph coreutils | xdot -
Mais il y a plus qu’un seul graphe ! Celui au-dessus est concis : c’est le
graphe des objets paquets, en omettant les entrées implicites comme GCC,
libc, grep, etc. Il est souvent utile d’avoir ces graphes concis, mais
parfois on veut voir plus de détails. guix graph
supporte
plusieurs types de graphes, qui vous permettent de choisir le niveau de
détails :
package
C’est le type par défaut utilisé dans l’exemple plus haut. Il montre le DAG des objets paquets, sans les dépendances implicites. C’est concis, mais omet pas mal de détails.
reverse-package
Cela montre le DAG inversé des paquets. Par exemple :
guix graph --type=reverse-package ocaml
... crée le graphe des paquets qui dépendent explicitement d’OCaml
(si vous êtes aussi intéressé·e dans le cas où OCaml représente une
dépendance implicite, voir reverse-bag
ci-dessous).
Remarquez que pour les paquets du cœur de la distribution, cela crée des
graphes énormes. Si vous voulez seulement voir le nombre de paquets qui
dépendent d’un paquet donnés, utilisez guix refresh
--list-dependent
(voir --list-dependent).
bag-emerged
C’est le DAG du paquet, avec les entrées implicites.
Par exemple, la commande suivante :
guix graph --type=bag-emerged coreutils
… montre ce graphe plus gros :
En bas du graphe, on voit toutes les entrées implicites de
gnu-build-system (voir gnu-build-system
).
Maintenant, remarquez que les dépendances de ces entrées implicites — c’est-à-dire les dépendances de bootstrap (voir Bootstrapping) — ne sont pas affichées, pour rester concis.
bag
Comme bag-emerged
mais cette fois inclus toutes les dépendances de
bootstrap.
bag-with-origins
Comme bag
, mais montre aussi les origines et leurs dépendances.
reverse-bag
Cela montre le DAG inverse des paquets. Contrairement à
reverse-package
, il montre aussi les dépendance implicites. Par
exemple :
guix graph -t reverse-bag dune
… crée le graphe des tous les paquets qui dépendent de Dune, directement
ou indirectement. Comme Dune est une dépendance implicite de
nombreux paquets via dune-build-system
, cela montre un plus grand
nombre de paquets, alors que reverse-package
en montrerait très peu,
voir aucun.
derivation
C’est la représentation lu plus détaillée : elle montre le DAG des dérivations (voir Dérivations) et des éléments du dépôt. Comparé à la représentation ci-dessus, beaucoup plus de nœuds sont visibles, dont les scripts de construction, les correctifs, les modules Guile, etc.
Pour ce type de graphe, il est aussi possible de passer un nom de fichier .drv à la place d’un nom de paquet, comme dans :
guix graph -t derivation $(guix system build -d my-config.scm)
module
C’est le graphe des modules de paquets (voir Modules de paquets). Par
exemple, la commande suivante montre le graphe des modules de paquets qui
définissent le paquet guile
:
guix graph -t module guile | xdot -
Tous les types ci-dessus correspondent aux dépendances à la construction. Le type de graphe suivant représente les dépendances à l’exécution :
references
C’est le graphe des references d’une sortie d’un paquet, telles que
renvoyées par guix gc --references
(voir Invoquer guix gc
).
Si la sortie du paquet donnée n’est pas disponible dans le dépôt,
guix graph
essayera d’obtenir les informations sur les dépendances
à travers les substituts.
Vous pouvez aussi passer un nom de fichier du dépôt plutôt qu’un nom de paquet. Par exemple, la commande ci-dessous produit le graphe des références de votre profile (qui peut être gros !) :
guix graph -t references $(readlink -f ~/.guix-profile)
referrers
C’est le graphe des référents d’un élément du dépôt, tels que renvoyés
par guix gc --referrers
(voir Invoquer guix gc
).
Cela repose exclusivement sur les informations de votre dépôt. Par exemple,
supposons que Inkscape est actuellement disponible dans 10 profils sur votre
machine ; guix graph -t referrers inkscape
montrera le graphe dont
la racine est Inkscape avec 10 profils qui y sont liés.
Cela peut aider à déterminer ce qui empêche un élément du dépôt d’être glané.
Souvent, le graphe du paquet qui vous intéresse ne tient pas sur votre
écran, et de toute façon tout ce que vous voulez savoir c’est
pourquoi ce paquet dépend en fait d’un paquet apparemment sans
rapport. L’option --path indique à guix graph
d’afficher
le chemin le plus court entre deux paquets (ou dérivations, ou éléments du
dépôt, etc.) :
$ 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
Parfois vous voudrez quand même visualiser le graphe mais préférerez le
recouper afin qu’il puisse être affiché. Un moyen pour ce faire est l’option
--max-depth (ou -M), qui vous laisse spécifier la
profondeur maximale du graphe. Dans l’exemple ci-dessous, nous visualisons
seulement libreoffice
et les nœuds dont la distance à
libreoffice
est au plus 2 :
guix graph -M 2 libreoffice | xdot -f fdp -
Attention hein, c’est encore un sacré plat de spaghetti, mais au moins
dot
peut en faire un rendu rapide et il est possible de le
parcourir un peu.
Les options disponibles sont les suivantes :
Produit un graphe en sortie de type type où type doit être l’un des types au-dessus.
Liste les types de graphes supportés.
Produit un graphe avec le moteur choisi.
Liste les moteurs de graphes supportés.
Actuellement les moteurs disponibles sont Graphviz et d3.js.
Affiche le chemin le plus court entre deux nœuds du type spécifié par
--type. L’exemple ci-dessous montre le chemin le plus court entre
libreoffice
et llvm
correspondant aux références de
libreoffice
:
$ 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
Considérer le paquet évalué par expr.
C’est utile pour précisément se référer à un paquet, comme dans cet exemple :
guix graph -e '(@@ (gnu packages commencement) gnu-make-final)'
Affiche le graphe pour système — p. ex. i686-linux
.
Le graphe de dépendance des paquets est la plupart du temps indépendant de l’architecture, mais il y a quelques parties qui dépendent de l’architecture que cette option vous permet de visualiser.
Ajoute répertoire au début du chemin de recherche de module de paquets (voir Modules de paquets).
Cela permet à des utilisateurs de définir leur propres paquets et les rendre disponibles aux outils en ligne de commande.
En plus de cela, guix graph
prend en charge toutes les options
habituelles de transformation des paquets (voir Options de transformation de paquets). Il est ainsi facile de voir l’effet d’une transformation de
réécriture de graphe telle que --with-input. Par exemple, la
commande ci-dessous produit le graphe de git
une fois que
openssl
a été remplacé par libressl
partout dans le graphe :
guix graph git --with-input=openssl=libressl
Tant de possibilités, tant de plaisir !
Suivant: Invoquer guix publish
, Précédent: Invoquer guix size
, Monter: Utilitaires [Table des matières][Index]