Next: , Previous: , Up: Utilidades   [Contents][Index]


9.10 Invocación de guix graph

Packages and their dependencies form a graph, specifically a directed acyclic graph (DAG). It can quickly become difficult to have a mental model of the package DAG, so the guix graph command provides a visual representation of the DAG. By default, guix graph emits a DAG representation in the input format of Graphviz, so its output can be passed directly to the dot command of Graphviz. It can also emit an HTML page with embedded JavaScript code to display a “chord diagram” in a Web browser, using the d3.js library, or emit Cypher queries to construct a graph in a graph database supporting the openCypher query language. With --path, it simply displays the shortest path between two packages. The general syntax is:

guix graph opciones paquete

Por ejemplo, la siguiente orden genera un archivo PDF que representa el GAD para GNU Core Utilities, mostrando sus dependencias en tiempo de construcción:

guix graph coreutils | dot -Tpdf > gad.pdf

La salida es algo así:

Grafo de dependencias de GNU Coreutils

Bonito y pequeño grafo, ¿no?

Puede encontrar más agradable la navegación interactiva del grafo con la orden xdot (del paquete xdot):

guix graph coreutils | xdot -

¡Pero hay más de un grafo! El grafo previo es conciso: es el grafo de los objetos package, omitiendo las entradas implícitas como GCC, libc, grep, etc. Es habitualmente útil tener un grafo conciso así, pero a veces una puede querer ver más detalles. guix graph implementa varios tipos de grafos, lo que le permite seleccionar el nivel de detalle:

package

Este es el tipo por defecto usado en el ejemplo previo. Muestra el GAD de objetos package, excluyendo dependencias implícitas. Es conciso, pero deja fuera muchos detalles.

reverse-package

Esto muestra el GAD inverso de paquetes. Por ejemplo:

guix graph --type=reverse-package ocaml

... emite el grafo de paquetes que dependen explícitamente de OCaml (si también tiene interés en casos donde OCaml es una dependencia implícita, véase reverse-bag a continuación).

Fíjese que esto puede producir grafos inmensos para los paquetes básicos. Si todo lo que quiere saber es el número de paquetes que dependen de uno determinado, use guix refresh --list-dependent (see --list-dependent).

bag-emerged

Este es el GAD del paquete, incluyendo entradas implícitas.

Por ejemplo, la siguiente orden:

guix graph --type=bag-emerged coreutils

... emite este grafo más grande:

Grafo de dependencias detallado de
GNU Coreutils

En la parte inferior del grafo, vemos todas las entradas implícitas de gnu-build-system (see gnu-build-system).

Ahora bien, fíjese que las dependencias de estas entradas implícitas—es decir, las dependencias del lanzamiento inicial (see Lanzamiento inicial)—no se muestran aquí para mantener una salida concisa.

bag

Similar a bag-emerged, pero esta vez incluye todas las dependencias del lanzamiento inicial.

bag-with-origins

Similar a bag, pero también muestra los orígenes y sus dependencias.

reverse-bag

Muestra el GAD inverso de paquetes. Al contrario que reverse-package, también tiene en cuenta las dependencias implícitas. Por ejemplo:

guix graph -t reverse-bag dune

... emite el grafo de tosos los paquetes que dependen de Dune, directa o indirectamente. Ya que Dune es una dependencia implícita de muchos paquetes vía dune-build-system, esto mostrará un gran número de paquetes, mientras que reverse-package mostraría muy pocos si muestra alguno.

derivation

Esta es la representación más detallada: muestra el GAD de derivaciones (see Derivaciones) y elementos simples del almacén. Comparada con las representaciones previas, muchos nodos adicionales son visibles, incluyendo los guiones de construcción, parches, módulos Guile, etc.

Para este tipo de grafo, también es posible pasar un nombre de archivo .drv en vez del nombre del paquete, como en:

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

Este es el grafo de los módulos de paquete (see Módulos de paquetes). Por ejemplo, la siguiente orden muestra el grafo para el módulo de paquetes que define el paquete guile:

guix graph -t module guile | xdot -

Todos los tipos previos corresponden a las dependencias durante la construcción. El grafo siguiente representa las dependencias en tiempo de ejecución:

references

Este es el grafo de referencias de la salida de un paquete, como lo devuelve guix gc --references (see Invocación de guix gc).

Si la salida del paquete proporcionado no está disponible en el almacén, guix graph intenta obtener la información de dependencias desde las sustituciones.

Aquí también puede proporcionar un nombre de archivo del almacén en vez de un nombre de paquete. Por ejemplo, la siguiente orden produce el grafo de referencias de su perfil (¡el cuál puede ser grande!):

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

Este es el grafo de referentes de la salida de un paquete, como lo devuelve guix gc --referrers (see Invocación de guix gc).

Depende exclusivamente de información en su almacén. Por ejemplo, supongamos que la versión actual de Inkscape está disponible en 10 perfiles en su máquina; guix graph -t referrers inkscape mostrará un grafo cuya raíz es Inkscape y con esos 10 perfiles enlazados a ella.

Puede ayudar a determinar qué impide que un elemento del almacén sea recolectado.

Habitualmente el grafo del paquete por el que tiene interés no entrará en su pantall, y en cualquier caso todo lo que quiere saber es por qué dicho paquete depende de algún paquete que parece no tener relación. La opción --path le indica a guix graph que muestre la ruta más corta entre dos paquetes (o derivaciones, o elementos del almacén, etcétera):

$ 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

Sometimes you still want to visualize the graph but would like to trim it so it can actually be displayed. One way to do it is via the --max-depth (or -M) option, which lets you specify the maximum depth of the graph. In the example below, we visualize only libreoffice and the nodes whose distance to libreoffice is at most 2:

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

Mind you, that’s still a big ball of spaghetti, but at least dot can render it quickly and it can be browsed somewhat.

Las opciones disponibles son las siguientes:

--type=tipo
-t tipo

Produce un grafo de salida de tipo, donde tipo debe ser uno de los valores enumerados previamente.

--list-types

Enumera los tipos de grafos implementados.

--backend=motor
-b motor

Produce un grafo usando el motor seleccionado.

--list-backends

Enumera los motores de grafos implementados.

Actualmente, los motores disponibles son Graphviz y d3.js.

--path

Muestra la ruta más corta entre dos nodos del tipo especificado por la opción --type. El ejemplo siguiente muestra la ruta más corta entre libreoffice y llvm de acuerdo con las referencias 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

Considera el paquete al que evalúa expr

Es útil para hacer una referencia precisa de un paquete concreto, como en este ejemplo:

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

Muestra el grafo para sistema—por ejemplo, i686-linux.

El grafo de dependencias del paquete es altamente independiente de la arquitectura, pero existen algunas partes dependientes de la arquitectura que esta opción le permite visualizar.

--load-path=directorio
-L directorio

Añade directorio al frente de la ruta de búsqueda de módulos de paquetes (see Módulos de paquetes).

Esto permite a las usuarias definir sus propios paquetes y hacerlos visibles a las herramientas de línea de órdenes.

Además de esto, guix graph permite todas las opciones habituales de transformación de paquetes (see Opciones de transformación de paquetes). Esto facilita la visualización del efecto de una transformación de reescritura de grafo como --with-input. Por ejemplo, la siguiente orden muestra el grafo de git una vez que openssl ha sido reemplazado por libressl en todos los nodos del grafo:

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

¡Tantas posibilidades, tanta diversión!


Next: Invocación de guix publish, Previous: Invocación de guix size, Up: Utilidades   [Contents][Index]