Suivant: , Précédent: , Monter: Utilitaires   [Table des matières][Index]


9.10 Invoque 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 :

Graphe de dépendance de GNU Coreutils

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 :

Graphe des dépendances détaillé de
GNU Coreutils

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 :

--type=type
-t type

Produit un graphe en sortie de type typetype doit être l’un des types au-dessus.

--list-types

Liste les types de graphes supportés.

--backend=moteur
-b moteur

Produit un graphe avec le moteur choisi.

--list-backends

Liste les moteurs de graphes supportés.

Actuellement les moteurs disponibles sont Graphviz et d3.js.

--path

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
--expression=expr
-e expr

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)'
--system=système
-s système

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.

--load-path=répertoire
-L répertoire

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]